WalkEd

By Valentin Laube Last update Aug 29, 2009 — Installed 34 times.
// ==UserScript==
// @name          WalkEd
// @namespace     http://www.cs.uni-magdeburg.de/~vlaube/
// @description	  Leveleditor for "Canvascape - 3D walker"
// @include       http://www.abrahamjoffe.com.au/ben/canvascape/
// @include       http://www.abrahamjoffe.com.au/ben/canvascape/textures.htm
// ==/UserScript==

// version 2 - fixed problems with XPCNativeWrappers (addEventListener doesn't like false as a fourth parameter)
//             http://dunck.us/collab/GreaseMonkeyUserScripts#head-4ac4d1e80f8bbd66bf4f1fbea77ea2390b6a2870

function getLeft(element) {
	var left = element.offsetLeft;
	var parent = element.offsetParent;
	
	while(parent) {
		left += parent.offsetLeft;
		parent = parent.offsetParent;
	}
	
	return left;
}

function getTop(element) {
	var top = element.offsetTop;
	var parent = element.offsetParent;
	
	while(parent) {
		top += parent.offsetTop;
		parent = parent.offsetParent;
	}
	
	return top;
}

////////////////////////////

function mousemove(e) {
	if(!ismousedown)
		return;
	
	var tile_count_x = mapwidth / unsafeWindow.arena[0].length;
	var tile_count_y = mapheight / unsafeWindow.arena.length;
	
	if(e.pageX >= mapleft && e.pageX <= mapleft+mapwidth &&
			e.pageY >= maptop  && e.pageY <= maptop +mapheight) {
		var x = Math.floor((e.pageX-mapleft)/tile_count_x);
		var y = Math.floor((e.pageY-maptop)/tile_count_y);
		if(x==lastx && y==lasty)
			return;
		lastx=x;
		lasty=y;
		if(value==-1)
			value= unsafeWindow.arena[x][y] = unsafeWindow.arena[x][y]?0:1;
		else
			unsafeWindow.arena[x][y] = value;
		unsafeWindow.initUnderMap();
		unsafeWindow.drawCanvas();
	}
	else {
		//mouseup(e);
	}
}

function mousedown(e) {
	ismousedown=true
}

function mouseup(e) {
	ismousedown=false;
	value=-1;
}

function click(e) {
	mousedown(e);
	mousemove(e);
	mouseup(e);
	lastx=lasty=-1;
}

function save(e) {
	var level = unsafeWindow.arena.toString();
	level+=","+unsafeWindow.playerPos.toString();
	level+=","+unsafeWindow.playerDir.toString();
	level+=","+unsafeWindow.playerPosZ.toString();
	GM_setValue("level", level);
}

function load(e) {
	var level = GM_getValue("level").split(",");
	if(level) {
		for(var i=0; i<100; i++) {
			unsafeWindow.arena[Math.floor(i/10)][i%10] = parseInt(level[i]);
		}
		
		unsafeWindow.playerPos[0] = parseFloat(level[100]);
		unsafeWindow.playerPos[1] = parseFloat(level[101]);
		unsafeWindow.playerDir = parseFloat(level[102]);
		unsafeWindow.playerPosZ = parseFloat(level[103]);
		unsafeWindow.initUnderMap();
		unsafeWindow.drawCanvas();
	}
}

////////////////////////////

var map = document.getElementById("underMap");
var mapleft = getLeft(map);
var maptop = getTop(map);
var mapwidth = map.offsetWidth;
var mapheight = map.offsetHeight;

var ismousedown = false;
var lastx=-1;
var lasty=-1;
var value=-1;

var button1 = document.createElement("input");
button1.type = "button";
button1.value = "Save";
button1.id = "btn_save";
button1.style.position="absolute";
button1.style.top="220px";
button1.style.left="15px";
map.parentNode.insertBefore(button1, map.nextSibling);

var button2 = document.createElement("input");
button2.type = "button";
button2.value = "Load";
button2.id = "btn_load";
button2.style.position="absolute";
button2.style.top="250px";
button2.style.left="15px";
map.parentNode.insertBefore(button2, map.nextSibling);

document.addEventListener("mousedown", mousedown, true);
document.addEventListener("mouseup", mouseup, true);
document.addEventListener("mousemove", mousemove, true);
document.addEventListener("click", click, true);
button1.addEventListener("click", save, true);
button2.addEventListener("click", load, true);