Module:TheEntireCastOfEoSD

From The Wiki Camp 2
Jump to navigation Jump to search

Documentation for this module may be created at Module:TheEntireCastOfEoSD/doc

p = {}

core_str = [[{
  "width": 320, "height": 480, "background": "black",
  "signals": [
    {"name": "gameover", "init": false, "streams": [
      {"type":"mouseover","expr": "gameover"}]},
    {"name": "timer", "init": 0, "streams": [
        {"type":"mouseover","expr": "if(gameover, timer, timer + 1)"}]},
    {"name": "dAngle", "init": 0, "streams": [
        {"type": "mouseover", "expr": "(dAngle + 1) % 360"}]},
    {"name": "currAngle", "init": 0, "streams": [
        {"type": "mouseover", "expr": "1080*pow(sin(timer/50), 5)"}]},
    {"name": "key_w", "init": 0, "streams": [
      {"type":"*:keydown[event.key=='w']","expr":"1"},
      {"type":"*:keyup[event.key=='w']","expr":"0"},
      {"type":"*:keydown[event.key=='W']","expr":"1"},
      {"type":"*:keyup[event.key=='W']","expr":"0"}]},
    {"name": "key_a", "init": 0, "streams": [
      {"type":"*:keydown[event.key=='a']","expr":"1"},
      {"type":"*:keyup[event.key=='a']","expr":"0"},
      {"type":"*:keydown[event.key=='A']","expr":"1"},
      {"type":"*:keyup[event.key=='A']","expr":"0"}]},
    {"name": "key_s", "init": 0, "streams": [
      {"type":"*:keydown[event.key=='s']","expr":"1"},
      {"type":"*:keyup[event.key=='s']","expr":"0"},
      {"type":"*:keydown[event.key=='S']","expr":"1"},
      {"type":"*:keyup[event.key=='S']","expr":"0"}]},
    {"name": "key_d", "init": 0, "streams": [
      {"type":"*:keydown[event.key=='d']","expr":"1"},
      {"type":"*:keyup[event.key=='d']","expr":"0"},
      {"type":"*:keydown[event.key=='D']","expr":"1"},
      {"type":"*:keyup[event.key=='D']","expr":"0"}]},
    {"name": "key_shift", "init": 0, "streams": [
      {"type":"*:keydown[event.shiftKey]","expr":"1"},
      {"type":"*:keyup[event.shiftKey]","expr":"0"}]},
    {"name": "playery", "init": 400, "streams": [
        {"type":"mouseover","expr": "if(gameover, playery, clamp(playery + (key_s-key_w)*(6-3*key_shift), 0, height))"}
    ]},
    {"name": "playerx", "init": 160, "streams": [
        {"type":"mouseover","expr": "if(gameover, playerx, clamp(playerx + (key_d-key_a)*(6-3*key_shift), 0, width))"}
    ]},
    {"name": "pos", "init": {"x": 145, "y": 385}, "streams": [
        {"type": "mouseover", "expr": "{x: playerx - 15, y:playery - 15}"}
    ]}
  ],
  "marks": [
    {"type": "image",
      "properties": {
        "enter": {
            "url": {"value": "wikifile:///DiaNiko.png"}
        },
        "update": {
            "x": {"signal":"pos.x"},
            "y": {"signal":"pos.y"},
            "aspect": {"value": "true"},
            "width": {"value": 31},
            "height": {"value": 31}
        }
    }},
    {"type": "image",
      "properties": {
        "enter": {
            "url": {"value": "wikifile:///TECOEoSD-Sprite.png"}
        },
        "update": {
            "x": {"value":137},
            "y": {"value":45},
            "aspect": {"value": "true"},
            "width": {"value": 46},
            "height": {"value": 71}
        }
    }}
  ]
}]]

gameover_blocker = mw.text.jsonDecode([[
{"type": "rect", "properties": {
	"enter": {
	    "x": {"value": 0},
	    "y": {"value": 0},
	    "width": {"value": 320},
	    "height": {"value": 480},
	    "fill": {"value": "grey"}
	},
	"update": {
		"opacity": {"signal": "gameover"}
	}
}}]])

gameover_text = mw.text.jsonDecode([[
{"type": "text", "properties": {
	"enter": {
	   "x": {"value": 160},
	   "y": {"value": 200},
	   "width": {"value": 320},
	   "height": {"value": 200},
	   "align": {"value": "center"},
	   "baseline": {"value": "top"},
	   "fontWeight": {"value": "bold"},
	   "fontSize": {"value": 36},
	   "fill": {"value": "white"},
	   "stroke": {"value": "lightblue"},
	   "strokeWidth": {"value": 2}
	   
	},
	"update": {
		"text": {"value": "Game Over"},
		"opacity": {"signal": "gameover"}
	}
}}]])

gameover_score = mw.text.jsonDecode([[
{"type": "text", "properties": {
	"enter": {
	   "x": {"value": 160},
	   "y": {"value": 250},
	   "width": {"value": 320},
	   "height": {"value": 200},
	   "align": {"value": "center"},
	   "baseline": {"value": "top"},
	   "fontWeight": {"value": "bold"},
	   "fontSize": {"value": 20},
	   "fill": {"value": "white"},
	   "stroke": {"value": "lightblue"},
	   "strokeWidth": {"value": 1}
	   
	},
	"update": {
		"text": {"template": "Score: {{timer|number:'09d'}}00"},
		"opacity": {"signal": "gameover"}
	}
}}]])

ARMS = 12

-- Radius
local function formatR(i)
	return "if(timer < " ..i.. " || gameover, bulletR"..i.." , if(bulletR"..i.. " > 497, 0, bulletR"..i.." + 5))"
end

-- Angle
local function formatT(i)
	return "if(bulletR" ..i.. " <= 5, currAngle, bulletT" ..i.. ")"
end

local function formatBulletSignal(i, j)
	angle = "bulletT" ..i.. " + " .. (math.floor(360 / ARMS) * (j-1))
	return "{x: 160 + bulletR" .. i .. " * cos((" .. angle .. ") * PI/180), "..
			"y:  80 + bulletR" .. i .. " * sin((" .. angle .. ") * PI/180)}"
end

function formatJson()
	core = mw.text.jsonDecode(core_str)
	gameover_str = "gameover"
	for i = 1,101 do
	    table.insert(core.signals, {name = "bulletR"..i, init = 500, streams = {
	    	{type = "mouseover", expr = formatR(i)}
	    }});
	    table.insert(core.signals, {name = "bulletT"..i, init = 0, streams = {
	    	{type = "mouseover", expr = formatT(i)}
	    }});
	    for j = 1,ARMS do
	    	table.insert(core.signals, {name = "bulletRing"..i.."Num"..j, init = {x = 100, y = 100, a = 0}, streams = {
	    		{type = "mouseover", expr = formatBulletSignal(i,j)}
	    	}});
	    	table.insert(core.marks, {type = "symbol", properties = {
	    		enter = {
	    			shape = {value = "circle"}, 
	    			size = {value = 20}, 
	    			fill= {value = "white"},
	    			stroke = {value = "red"},
	    			strokeWidth = {value = 1}
	    		},
	    		update = {
		    		xc = {signal = "bulletRing"..i.."Num"..j..".x"},
		    		yc = {signal = "bulletRing"..i.."Num"..j..".y"}
	    		}
	    	}})
	        gameover_str = gameover_str .. 
	        	" | (pow(playerx - bulletRing"..i.."Num"..j..".x, 2) + pow(playery - bulletRing"..i.."Num"..j..".y, 2) < 25)"
    	end
	end
	core.signals[1].streams[1].expr = gameover_str
	table.insert(core.marks, gameover_blocker)
	table.insert(core.marks, gameover_text)
	table.insert(core.marks, gameover_score)
	return mw.text.jsonEncode(core)
end

p.process = function(frame)
	return frame:preprocess("<graph>" .. formatJson() .. "</graph>")
end

p.formatJson = formatJson;
return p