progers_game/public/lib/inter.js
n0rdye d245bc717b new file: .gitignore
new file:   index.js
	new file:   package-lock.json
	new file:   package.json
	new file:   public/lib/functions.js
	new file:   public/lib/html2canvas.js
	new file:   public/lib/inter.js
	new file:   public/lib/inter_temp.js
	new file:   public/lib/interact.js
	new file:   public/lib/interact.js.map
	new file:   public/lib/jquery.cookie.js
	new file:   public/lib/jquery.js
	new file:   server.js
	new file:   views/condition/lvl-1.ejs
	new file:   views/condition/lvl-2.ejs
	new file:   views/condition/lvl-3.ejs
	new file:   views/condition/lvl-4.ejs
	new file:   views/condition/lvl-5.ejs
	new file:   views/consecution/lvl-1.ejs
	new file:   views/consecution/lvl-2.ejs
	new file:   views/consecution/lvl-3.ejs
	new file:   views/consecution/lvl-4.ejs
	new file:   views/consecution/lvl-5.ejs
	new file:   views/looping/lvl-1.ejs
	new file:   views/looping/lvl-2.ejs
	new file:   views/looping/lvl-3.ejs
	new file:   views/looping/lvl-4.ejs
	new file:   views/looping/lvl-5.ejs
	new file:   views/lvls/lvls_1.ejs
	new file:   views/lvls/lvls_2.ejs
	new file:   views/main.ejs
	new file:   views/old/condition/lvl-1.ejs
	new file:   views/old/condition/lvl-2.ejs
	new file:   views/old/condition/lvl-3.ejs
	new file:   views/old/condition/lvl-4.ejs
	new file:   views/old/condition/lvl-5.ejs
	new file:   views/old/consecution/lvl-1.ejs
	new file:   views/old/consecution/lvl-2.ejs
	new file:   views/old/consecution/lvl-3.ejs
	new file:   views/old/consecution/lvl-4.ejs
	new file:   views/old/consecution/lvl-5.ejs
	new file:   views/old/looping/lvl-1.ejs
	new file:   views/old/looping/lvl-2.ejs
	new file:   views/old/looping/lvl-3.ejs
	new file:   views/old/looping/lvl-4.ejs
	new file:   views/old/looping/lvl-5.ejs
	new file:   views/static/404.ejs
	new file:   views/static/end.ejs
	new file:   views/static/header.ejs
	new file:   views/static/start.ejs
2023-11-14 02:32:19 +05:00

459 lines
18 KiB
JavaScript
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

window.dragMoveListener = dragMoveListener;
let root = document.getElementById("drags");
let objs = { height:"2",width:"4",color:"#FFFFFF"};
let objs_store = {};
let proj_from = "cloud";
let cur_obj;
let objs_back = [];
let objs_forw = [];
let proj_state = "loading";
let cm_mod = 2;
function create(clas,x,y,color = null,id,size,layer = 0){
let main_clas = clas.split(" ")[0];
// if (body == null || body == "") body = "[]";
let obj = document.createElement("img");
obj.id = id;
obj.alt = id;
clas= clas.split(" ");
clas.forEach(cl => {
obj.classList.add(cl);
});
get_obj(main_clas,(db_data)=>{
// console.log(db_data);
// console.log(db_data);
// db_data.forEach(db_data => {
// });
if (db_data == null) {
delete objs[main_clas];
reload();
// if(proj_from == "cloud"){
// // save(()=>{
// // // goto("/proj/load/"+proj_name);
// // },false);
// }
// else if (proj_from == "local"){
// save_local();
// load_proj_local();
// }
}
else if (db_data != null){
make(objs_store[main_clas]["img"])
}
function make(img){
// console.log(db_data);
obj.src = img;
obj.title = `${db_data["name"].replaceAll("$"," ").split("~g")[0]}\nцена:${db_data["cost"]}\nширина:${db_data["width"]}см высота:${db_data["height"]}см`;
obj.setAttribute("cost",db_data["cost"])
obj.setAttribute("colors",Boolean(db_data["colors"]))
obj.setAttribute("data-img",img)
obj.setAttribute("gid",db_data["gid"])
obj.setAttribute("pid",db_data["pid"])
obj.setAttribute("color",color)
// drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`;
if(size){
obj.style.width = `${db_data["width"] * cm_mod}px`;
obj.style.height = `${db_data["height"] * cm_mod}px`;
}
if (color != null){
obj_color_change(color,obj)
}
}
calc_total();
})
obj.setAttribute("decoding","async");
obj.setAttribute("loading","lazy");
if(id != "none"){obj.setAttribute("onclick",`obj_click("${id}")`);}
// console.log(main_clas);
if(main_clas.split("~p~").at(-1) == "Бизиборды"){
obj.setAttribute("layer",9999);
obj.style.zIndex = 9999;
}
else{
obj.setAttribute("layer",layer);
obj.style.zIndex = layer;
}
root.append(obj);
set_pos(obj,x,y);
}
function obj_click(id){
if (cur_obj != id){
let obj = document.getElementById(id);
let cur_layer = obj.style.zIndex;
cur_obj = id;
if(cur_layer=="9999"){
document.getElementsByClassName("layer_changer")[0].style.pointerEvents = "none";
document.getElementById("layer_inp").value = "-";
}
else{
document.getElementsByClassName("layer_changer")[0].style.pointerEvents = "all";
document.getElementById("layer_inp").value = cur_layer;
}
if (obj.getAttribute("colors") == "true"){
clear_palette();
obj_colors_load(()=>{
document.getElementById("obj_color_div").style.display = "flex";
if( document.getElementById(`color_${obj.getAttribute("color")}`) != null){
document.getElementById(`color_${obj.getAttribute("color")}`).style.border = "1px blue solid"
}
});
}
else{
document.getElementById("obj_color_div").style.display = "none";
}
obj_selection();
// console.log(obj.);
}
}
function obj_selection(clear = false){
cur_obj = (clear == true)? null:cur_obj;
let drags = document.getElementsByClassName("drag");
Object.values(drags).forEach(element => {
// console.log(element.id,cur_obj);
if (element.id != cur_obj){
element.style.border = "0px";
}
else{
element.style.border = "2px black solid";
element.style.borderRadius = "0.2vw";
}
});
}
function resize_drags(){
document.getElementById('drags').setAttribute("data-x",document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px");
document.getElementById('drags').style.left = document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px";
document.getElementById('drags').style.width = document.getElementsByClassName("wall")[0].style.width;
document.getElementsByClassName("zones")[0].style.height = document.getElementsByClassName("wall")[0].style.height;
drag_start();
}
function wall_size_change(type,value = null){
if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
let wall = document.getElementsByClassName("wall")[0];
let drags = document.getElementById("drags");
let scroll;
if(type != null && type == "width") {
if (value == null) scroll = parseFloat(document.getElementById("wall_width").value);
else if (value != null) scroll = value;
// document.getElementById("wall_width_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10);
// document.getElementById("wall_width_value").innerHTML = `${scroll}м`;
// console.log(scroll);
wall.style.width = `${(scroll * 100) * cm_mod}px`;
wall.style.left = drags.getBoundingClientRect().left;
objs["width"] = scroll;
}
if(type != null && type == "height") {
if (value == null) scroll = parseFloat(document.getElementById("wall_height").value);
else if (value != null) scroll = value;
// document.getElementById("wall_height_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10);
// document.getElementById("wall_height_value").innerHTML = `${scroll}м`;
// console.log(scroll);
wall.style.height = `${(scroll * 100) * cm_mod}px`;
objs["height"] = scroll;
}
}
function calc_total(start = false){
document.getElementById("cost_list").innerHTML = ""
if (start) {
document.getElementById("proj_cost_text").innerText = `Стоимость: ${objs["total"]} руб.`;
return;
}
let total=0;
Object.entries(objs).forEach(([key,value]) => {
// console.log(key);
if(key != "height"&&key!="width"&key!="total"){
// console.log(Object.keys(value).length);
// console.log(objs_store[key]);
if(objs_store[key] != null && objs_store[key]["cost"] > 0 && JSON.parse(document.getElementById(`group_drop-${objs_store[key]["pid"]}`).getAttribute("no-cost")) == false){
// console.log(key,value);
total += parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length);
let obj_cost_div = document.createElement("li");
obj_cost_div.innerHTML =
`<div style="display:flex;"> ` +
`<div id='obj_cost_name' style='font-size:calc(var(--main-font-size)/1);'>${key.split("~g~")[0].replaceAll("$"," ")}`+
`<div id='obj_cost_count'>&nbsp${Object.keys(value).length}X</div> </div>`+
`</div>`+
`<div id='obj_cost'>${parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length)}</div>`;
document.getElementById("cost_list").append(obj_cost_div);
}
}
// console.log(Object.keys(objs).at(-1));
});
// return total;
objs["total"] = total;
document.getElementById("proj_cost_text").innerText = `стоимость: ${total} руб.`;
}
function load(objss){
proj_state = "loading";
// objs = JSON.parse($.cookie("objs"));
// console.log(objs);
objs = objss;
Object.entries(objs).forEach(([keys, values]) => {
// console.log(keys,values);
if (keys != "width" && keys != "height" && keys != "color" && keys != "grided"){
Object.entries(values).forEach(([key, value]) => {
if(key != "class"){
// console.log(key,keys);
// console.log(keys,value["x"],value["y"],value["body"]);
// let count = Object.keys(objs[keys]).length;
// console.log(count);
create(keys+" drag",value["x"],value["y"],value["color"],key,true,value["layer"]);
}
})
}
else {
document.getElementById(`wall_${keys}`).value = values;
wall_size_change(keys,values);
// document.getElementById("drags").style.left = $(".dropzone")[0].getBoundingClientRect().x;
}
if (keys == "color"){
document.getElementById("wall").style.backgroundColor = values;
}
if (keys == Object.keys(objs).at(-1)){
proj_state = "loaded";
loaded();
}
});
resize_drags();
}
function reload(save = false){
// objs = JSON.parse($.cookie("objs"));
// console.log(objs);
document.getElementById("drags").innerHTML = "";
load(objs);
if(save){save(()=>{},false)}
}
function load_proj_cloud(){
proj_from = "cloud";
document.getElementById("drags").innerHTML = "";
// document.getElementById("top_panel_center").innerText = `загрузка ${proj_name} из облака`;
$.post( "/load_proj",{name:proj_name})
.done(function( res ) {
if(res["out"] == "good"){
// console.log("good");
// console.log(JSON.parse(`'${res["body"]}'`));
// console.log(JSON.parse(res["body"]));
// $.cookie("objs",res["body"]);
load(JSON.parse(res["body"]));
// document.getElementById("top_panel_center").innerText = `${proj_name} (облако)`;
}
else if(res["out"] == "bad proj"){
// console.log("bad");
save(()=>{
goto("/proj/load/"+proj_name);
},false);
}
})
}
function load_proj_local(){
// document.getElementById("top_panel_center").innerText = `loading ${proj_name} from local storage`;
proj_from = "local";
if(localStorage.getItem(proj_name) == null){
save_local()
}
// document.getElementById("top_panel_center").innerText = `${proj_name} (локальное хранилище)`;
document.getElementById("drags").innerHTML = "";
load(JSON.parse(localStorage.getItem(proj_name)));
}
function save_local(){
// console.log(objs);
proj_from = "local";
localStorage.setItem(proj_name,JSON.stringify(objs));
}
function save(callback,with_pic = true){
// console.log(objs);
proj_from = "cloud";
if(with_pic){
proj_img((src)=>{
make_save(src);
})
}
else{
make_save();
}
function make_save(src = "img/img_placeholder.webp"){
$.post( "/save_proj", {proj:JSON.stringify(objs),name:proj_name,img:src})
.done(function( res ) {
if(res["out"] == "good"){
// console.log(scr)
// console.log("good");
if(callback) callback(res);
}
})
}
}
function load_objs(callback,group){
// let select = document.getElementById("group_select");
// console.log(group);
$.post( "/get_objs",{gid:group})
.done(function( res ) {
if(res["out"] == "good"){
// console.log(res["body"]);
res["body"].forEach(element => {
objs_store[`${element["name"]}`] = {img:element["img"],height:element["height"],width:element["width"],id:element["id"],name:element["name"],cost:element["cost"],colors:element["colors"],gid:element["gid"],pid:element["pid"]}
});
callback(res["body"]);
}
});
}
function get_obj(clas,callback){
if(objs_store[clas] != null){
callback(objs_store[clas]);
}
else{
load_objs(()=>{
callback(objs_store[clas]);
})
}
}
function load_obj(name,key,callback){
$.post( "/get_obj",{name:name,key:key})
.done(function( res ) {
if(res["out"] == "good"){
// console.log(res["body"]);
callback(res["body"]);
}
});
}
function dragMoveListener (event) {
var drag = event.target
if(drag.id != "none"){obj_click(drag.id)}
var x = (parseFloat(drag.getAttribute('data-x')) || 0) + event.dx
var y = (parseFloat(drag.getAttribute('data-y')) || 0) + event.dy
set_pos(drag,x,y);
}
let dragzone = document.getElementsByClassName('wall')[0];
interact('.drag').draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({restriction: dragzone,endOnly: true,elementRect:{ left: 0.15, right: 0.85, top: 0, bottom: 1 }}),
interact.modifiers.snap({targets: [interact.snappers.grid({ x: cm_mod, y: cm_mod })],range: Infinity,relativePoints: [ { x: 0, y: 0 } ]}),
],
autoScroll: true,
listeners: {move: dragMoveListener, end (event) {}}
})
// interact('.trash').dropzone({
// accept: '.drag',
// overlap: 0.2,
// ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
// // console.log(drag.classList);
// if(objs[drag.classList[0]] != null&&objs[drag.classList[0]][drag.id] != null) {
// delete objs[drag.classList[0]][drag.id];
// }
// calc_total()
// zone.classList.add('drop-target');drag.classList.add('can-drop');
// drag.remove();
// },
// ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
// ondrop: function (event) {var drag = event.relatedTarget;
// // console.log(drag.id);
// // console.log(objs);
// drag.classList.add('in_zone');drag.classList.remove('can-drop');
// },
// ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
// })
interact('.dropzone').dropzone({
accept: '.drag',
overlap: 0.5,
ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
if (objs[drag.classList[0]] == null){
objs[drag.classList[0]] = {};
}
if(drag.id == "none") drag.id = get_id(drag.classList[0]);
if (objs[drag.classList[0]][drag.id] == null){
objs[drag.classList[0]][drag.id] = {};
drag.setAttribute("onclick",`obj_click("${drag.id}")`);
calc_total()
}
zone.classList.add('drop-target');drag.classList.add('can-drop');
},
ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
ondrop: function (event) {var drag = event.relatedTarget
if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
objs[drag.classList[0]][drag.id] = {y:drag.getAttribute('data-y'),x:drag.getAttribute('data-x'),body:drag.innerHTML,color:drag.getAttribute("color"),layer:drag.getAttribute('layer')};
drag.classList.add('in_zone');drag.classList.remove('can-drop');
// console.log(objs["KeyBoard~g~не$основное"]["KeyBoard~g~не$основное_1"]);
},
ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
})
interact('.createzone').dropzone({
accept: '.spawn',
overlap: 0.2,
ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
zone.classList.add('drop-target');drag.classList.add('can-drop');
},
ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;
if(drag.classList[1] == "spawn" && drag.classList[0] == zone.classList[0]){
get_obj(drag.classList[0],(db_data)=>{
// drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`;
drag.style.width = `${db_data["width"] * cm_mod}px`;
drag.style.height = `${db_data["height"] * cm_mod}px`;
// console.log(db_data);
})
let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left;
let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top;
create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0);
if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
drag.classList.remove('spawn');
}
zone.classList.remove('drop-target');
},
ondrop: function (event) {var drag = event.relatedTarget;
drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
ondropdeactivate: function (event) {var zone = event.target;
zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
})
function drag_start() {
let spawns = document.getElementsByClassName("spawn");
Object.entries(spawns).forEach(([key, spawn]) => {
spawn.parentElement.removeChild(spawn);
});
let zones = document.getElementsByClassName("createzone");
Object.entries(zones).forEach(([key, zone]) => {
let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left;
let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top;
create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0);
});
}
function get_id(clas){
if(objs[clas] == null){ return `${clas}_0`}
else{
let count = Object.keys(objs[clas]).length;
return `${clas}_${count}`;
}
}