Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Copyright (c) 2013 Perttu Ahola <celeron55@gmail.com>
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- var __tmp = function(){
- var h1e = {}
- h1edpi_module = h1e
- /* H1edpi */
- ERROR_COOLDOWN = 30*5
- h1e.canvas = undefined
- h1e.w = undefined
- h1e.h = undefined
- h1e.fps = undefined
- h1e.ctx = undefined
- h1e.started = false
- h1e.sprites = {}
- h1e.sections = []
- h1e.preloading = true
- h1e.error_cooldown = 0
- h1e.num_sprites_incomplete = 0
- h1e.bgstyle = "#005500"
- h1e.keys = {}
- h1e.has_focus = true
- h1e.cb_draw_no_focus = undefined
- h1e.init = function(canvas, w, h, fps){
- h1e.checkdom(canvas)
- h1e.checkinteger(w)
- h1e.checkinteger(h)
- h1e.checkinteger(fps)
- h1e.canvas = canvas
- h1e.w = w
- h1e.h = h
- h1e.fps = fps
- h1e.update_scale()
- }
- h1e.resize_canvas = function(w, h){
- $("#main_canvas")[0].width = Math.floor((w)/12)*12
- $("#main_canvas")[0].height = Math.floor((h)/12)*12
- h1e.update_scale()
- }
- h1e.update_scale = function(){
- var canvas = h1e.canvas
- h1e.scale = Math.floor(Math.min(canvas.width/h1e.w, canvas.height/h1e.h))
- h1e.off_x = (canvas.width - h1e.w*h1e.scale) / 2
- h1e.off_y = (canvas.height - h1e.h*h1e.scale) / 2
- var section = h1e.sections[h1e.sections.length-1]
- if(section)
- section._h1e_updated = true
- }
- h1e.add_image = function(name, url){
- h1e.preload.add_image(name, url)
- }
- h1e.def_sprite = function(sprite_name, img_name, tcs){
- h1e.checkstring(sprite_name)
- h1e.checkstring(img_name)
- if(!h1e.isarray(tcs) && tcs !== undefined)
- throw new Error("tcs should be array or undefined")
- h1e.sprites[sprite_name] = {
- img_name: img_name,
- tcs: tcs,
- cache_img: undefined,
- cache_scale: undefined,
- draw_iteration: 0,
- error_count: 0,
- }
- }
- h1e.get_frame_count = function(sprite_name){
- var sprite = h1e.sprites[sprite_name]
- if(!sprite)
- throw new Error("Sprite \""+sprite_name+"\" does not exist")
- return sprite.tcs.length
- }
- h1e.draw_rect = function(x, y, w, h, fillStyle){
- h1e.ctx.fillStyle = fillStyle
- h1e.ctx.fillRect(x*h1e.scale, y*h1e.scale, w*h1e.scale, h*h1e.scale)
- }
- h1e.draw_sprite = function(x, y, sprite_name, opts){
- var sprite = h1e.sprites[sprite_name]
- if(!sprite){
- console.log("h1e.draw_sprite: Couldn't get sprite")
- h1e.error_cooldown = ERROR_COOLDOWN
- return
- }
- var img = h1e.get_sprite_image(sprite)
- if(!img){
- return
- }
- var tc = undefined
- if(sprite.tcs){
- var frame = 0
- if(opts && opts.frame)
- frame = opts.frame
- var tc = sprite.tcs[frame]
- if(tc === undefined)
- throw new Error(sprite_name+" does not have frame "+frame)
- } else {
- tc = [0, 0, img.width/h1e.scale, img.height/h1e.scale]
- }
- var sx = tc[0]
- var sy = tc[1]
- var sw = tc[2]
- var sh = tc[3]
- var dx = x
- var dy = y
- var dw = tc[2]
- var dh = tc[3]
- if(opts && opts.cut){
- sx += opts.cut[0]
- sy += opts.cut[1]
- sw = opts.cut[2]
- sh = opts.cut[3]
- dw = opts.cut[2]
- dh = opts.cut[3]
- }
- var s = h1e.scale
- h1e.ctx.drawImage(img, sx*s, sy*s, sw*s, sh*s, dx*s, dy*s, dw*s, dh*s)
- //h1e.ctx.drawImage(img, dx, dy)
- }
- h1e.push_section = function(section){
- h1e.checkobject(section)
- section._h1e_updated = true
- h1e.sections.push(section)
- }
- h1e.remove_section = function(section){
- var i = h1e.sections.indexOf(section)
- if(i != -1)
- h1e.sections.splice(i, 1)
- else
- throw new Error("h1e.remove_section: Section not found")
- }
- h1e.keyname_to_keycodes = function(keyname){
- var keycodes = {
- left: [37],
- up: [38],
- right: [39],
- down: [40],
- space: [32],
- escape: [27],
- }
- if(keycodes[keyname])
- return keycodes[keyname]
- if(h1e.isinteger(keyname))
- return [keyname]
- if(h1e.isstring(keyname) && keyname.length == 1)
- return [keyname.toUpperCase().charCodeAt(0)]
- throw new Error("Unknown keyname: \""+keyname+"\"")
- }
- h1e.iskey = function(key, keyname){
- var keynames = h1e.isarray(keyname) ? keyname : [keyname]
- return keynames.some(function(keyname){
- var keycodes = h1e.keyname_to_keycodes(keyname)
- return keycodes.some(function(keycode){
- if(key == keycode)
- return true
- })
- })
- }
- h1e.keydown = function(keyname){
- var keycodes = h1e.keyname_to_keycodes(keyname)
- return keycodes.some(function(keycode){
- if(h1e.keys[keycode])
- return true
- })
- }
- h1e.start = function(){
- if(h1e.started)
- throw new Error("h1e.start: h1edpi already started")
- h1e.started = true
- h1e.preload.all_added(function(){
- h1e.preloading = false
- })
- document.addEventListener('keydown', function(e){
- h1e.keys[e.keyCode] = true
- var section = h1e.sections[h1e.sections.length-1]
- if(section && section.event(h1e, {type:"keydown", key:e.keyCode}))
- section._h1e_updated = true
- })
- document.addEventListener('keyup', function(e){
- h1e.keys[e.keyCode] = false
- var section = h1e.sections[h1e.sections.length-1]
- if(section && section.event(h1e, {type:"keyup", key:e.keyCode}))
- section._h1e_updated = true
- })
- window.onfocus = function(e){
- h1e.has_focus = true
- }
- window.onblur = function(e){
- h1e.has_focus = false
- }
- h1e.ctx = h1e.canvas.getContext("2d")
- h1e.ctx.imageSmoothingEnabled = false
- function draw_bg(){
- if(h1e.bgstyle){
- h1e.draw_rect(0, 0, h1e.w, h1e.h, h1e.bgstyle)
- }
- }
- function update(){
- setTimeout(update, 1000/h1e.fps)
- var section = h1e.sections[h1e.sections.length-1]
- if(section && section.update){
- var r = section.update(h1e)
- if(r) section._h1e_updated = true
- }
- }
- update()
- var last_has_focus = true
- function draw(){
- window.requestAnimationFrameCompatible(draw)
- if(h1e.error_cooldown){
- h1e.error_cooldown--
- return
- }
- h1e.ctx.save()
- h1e.ctx.beginPath()
- h1e.ctx.rect(h1e.off_x, h1e.off_y, h1e.scale*h1e.w, h1e.scale*h1e.h)
- h1e.ctx.clip()
- h1e.ctx.translate(h1e.off_x, h1e.off_y)
- var section = h1e.sections[h1e.sections.length-1]
- if(h1e.preloading){
- draw_bg()
- h1e.ctx.save()
- h1e.ctx.fillStyle = "#ffffff"
- h1e.ctx.fillText("[Preloading...]", 40, 40)
- h1e.ctx.restore()
- } else if(section){
- if(section._h1e_updated || (h1e.has_focus != last_has_focus)){
- draw_bg()
- section.draw(h1e)
- if(h1e.num_sprites_incomplete == 0)
- section._h1e_updated = false
- if(!h1e.has_focus && h1e.cb_draw_no_focus)
- h1e.cb_draw_no_focus(h1e)
- last_has_focus = h1e.has_focus
- }
- } else {
- draw_bg()
- h1e.ctx.save()
- h1e.ctx.fillStyle = "#ffffff"
- h1e.ctx.fillText("[No Section]", 40, 40)
- h1e.ctx.restore()
- }
- h1e.ctx.restore()
- for(name in h1e.sprites){
- var sprite = h1e.sprites[name]
- sprite.draw_iteration++
- }
- h1e.num_sprites_incomplete = 0
- }
- window.requestAnimationFrameCompatible(draw)
- }
- /* Internal */
- h1e.get_sprite_image = function(sprite){
- h1e.checkobject(sprite)
- if(sprite.cache_img && sprite.cache_scale == h1e.scale){
- if(!sprite.cache_img.complete){
- h1e.num_sprites_incomplete++
- }
- return sprite.cache_img
- }
- var img = h1e.get_image(sprite.img_name+"|scale="+h1e.scale)
- if(!img){
- h1e.num_sprites_incomplete++
- if(sprite.draw_iteration < 3)
- return undefined
- sprite.error_count++
- if(sprite.error_count > 10){
- console.log("h1e.get_sprite_image: Failed to get \""+sprite.img_name+
- "\"")
- h1e.error_cooldown = ERROR_COOLDOWN
- }
- return undefined
- }
- sprite.cache_img = img
- sprite.cache_scale = h1e.scale
- return sprite.cache_img
- }
- h1e.get_image = function(name, base){
- var img = undefined
- var next = undefined
- if(base){
- img = base
- next = name
- } else {
- var m = /(.+?)\|(.+)/.exec(name)
- var first = m[1]
- //console.log("first:", m)
- img = h1e.preload.images[first]
- if(!img || !img.complete){
- console.log("h1e.get_image:", first, "not found or not complete")
- h1e.error_cooldown = ERROR_COOLDOWN
- return undefined
- }
- next = m[2]
- }
- var m = /(.+?)\|(.+)/.exec(next)
- if(!m)
- m = [undefined, next]
- //console.log("mod:", m)
- var mod = m[1]
- methods = [
- {t: function(mod){
- return /scale=(\d+)/.exec(mod)
- },f: function(img, m){
- var scale = Number(m[1])
- //console.log("scale:", scale)
- return h1e.scale_image(img, scale)
- }},
- {t: function(mod){
- return /mask=(#[a-f0-9]+)/.exec(mod)
- },f: function(img, m){
- var color = new h1e.Color(m[1])
- //console.log("color:", color)
- return h1e.mask_image(img, color)
- }},
- {t: function(mod){
- return /recolor=(#[a-f0-9]+),(#[a-f0-9]+)/.exec(mod)
- },f: function(img, m){
- var from = new h1e.Color(m[1])
- var to = new h1e.Color(m[2])
- //console.log("from:", from)
- //console.log("to:", to)
- return h1e.recolor_image(img, from, to)
- }},
- ]
- var did = methods.some(function(method){
- var m2 = method.t(mod)
- if(m2){
- //console.log("Applying", mod, "in", name)
- img = method.f(img, m2)
- return true
- }
- })
- if(!did){
- console.log("h1e.get_image: Invalid mod:", mod)
- h1e.error_cooldown = ERROR_COOLDOWN
- return undefined
- }
- next = m[2]
- if(next){
- if(!img.complete){
- console.log("h1e.get_image:", name, "is incomplete for now")
- return undefined
- }
- return h1e.get_image(next, img)
- } else {
- return img
- }
- }
- /* Image preloading */
- h1e.preload = {}
- h1e.preload.on_images_preloaded = undefined
- h1e.preload.num_images_loading = 1
- h1e.preload.images_loading = {"__all_not_added": true}
- h1e.preload.num_images_failed = 0
- h1e.preload.images_failed = {}
- h1e.preload.images = {}
- h1e.preload.image_loaded = function(name){
- console.log("__preload: Image loaded: \""+name+"\"")
- delete h1e.preload.images_loading[name]
- h1e.preload.num_images_loading--
- if(h1e.preload.num_images_loading == 0){
- console.log("__preload: All images loaded")
- h1e.preload.on_images_preloaded()
- }
- }
- h1e.preload.image_error = function(name){
- h1e.preload.images_failed[name] = h1e.preload.images_loading[name]
- delete h1e.preload.images_loading[name]
- h1e.preload.num_images_loading--
- h1e.preload.num_images_failed++
- console.log("__preload: Failed to load image: \""+name+"\"")
- if(h1e.preload.num_images_loading == 0)
- h1e.preload.on_images_preloaded()
- }
- h1e.preload.add_image = function(name, src){
- if(src === undefined)
- src = name
- console.log("__preload: preload.add_image(\""+name+"\", \""+src+"\")")
- var img = new Image()
- img.onload = function(){
- h1e.preload.image_loaded(name)
- }
- img.onerror = function(){
- h1e.preload.image_error(name)
- }
- img.src = src
- h1e.preload.images[name] = img
- h1e.preload.images_loading[name] = img
- h1e.preload.num_images_loading++
- }
- h1e.preload.add_images = function(images){
- for(var name in images){
- h1e.preload.add_image(name, images[name])
- }
- }
- h1e.preload.all_added = function(callback){
- h1e.preload.on_images_preloaded = callback
- h1e.preload.image_loaded("__all_not_added")
- }
- h1e.preload.clear = function(){
- h1e.preload.images_loading = {"__all_not_added": true}
- h1e.preload.num_images_failed = 0
- h1e.preload.images_failed = {}
- h1e.preload.images = {}
- }
- /* Image processing */
- h1e.scale_image = function(img, scale)
- {
- h1e.checkdom(img)
- h1e.checkinteger(scale)
- var w = img.width
- var h = img.height
- h1e.assert(w && h)
- var canvas = document.createElement('canvas')
- canvas.width = w
- canvas.height = h
- var ctx = canvas.getContext("2d")
- ctx.drawImage(img, 0, 0)
- var w2 = img.width * scale
- var h2 = img.height * scale
- var canvas2 = document.createElement('canvas')
- canvas2.width = w2
- canvas2.height = h2
- var ctx2 = canvas2.getContext("2d")
- //ctx2.drawImage(img, 0, 0, w2, h2)
- var s = scale
- var im = ctx.getImageData(0, 0, w, h)
- var im2 = ctx2.getImageData(0, 0, w2, h2)
- h1e.checkobject(im2)
- for(var y=0; y<h; y++){
- for(var x=0; x<w; x++){
- for(var y2=0; y2<scale; y2++){
- for(var x2=0; x2<scale; x2++){
- im2.data[((y*s+y2)*w2+x*s+x2)*4+0] = im.data[(y*w+x)*4+0]
- im2.data[((y*s+y2)*w2+x*s+x2)*4+1] = im.data[(y*w+x)*4+1]
- im2.data[((y*s+y2)*w2+x*s+x2)*4+2] = im.data[(y*w+x)*4+2]
- im2.data[((y*s+y2)*w2+x*s+x2)*4+3] = im.data[(y*w+x)*4+3]
- }
- }
- }
- }
- /*for(var i=0; i<w2*h2; i++){
- im2.data[i*4+0] = 255
- im2.data[i*4+1] = 0
- im2.data[i*4+2] = 150
- im2.data[i*4+3] = 255
- }*/
- ctx2.putImageData(im2, 0, 0)
- var dataurl = canvas2.toDataURL()
- var img2 = new Image()
- img2.src = dataurl
- return img2
- }
- h1e.Color = function(r, g, b)
- {
- if(h1e.isstring(r)){
- if(r.substr(0,1) != "#")
- throw "Invalid color string"
- this.r = parseInt(r.substr(1,2), 16)
- this.g = parseInt(r.substr(3,2), 16)
- this.b = parseInt(r.substr(5,2), 16)
- } else {
- this.r = r
- this.g = g
- this.b = b
- }
- }
- h1e.Color.prototype.r = 0
- h1e.Color.prototype.g = 0
- h1e.Color.prototype.b = 0
- h1e.Color.prototype.toString = function(){
- return "["+this.r+","+this.g+","+this.b+"]"
- }
- h1e.Color.prototype.eqArr = function(arr, i){
- return this.r == arr[i+0] && this.g == arr[i+1] && this.b == arr[i+2]
- }
- h1e.Color.prototype.setArr = function(arr, i){
- arr[i+0] = this.r
- arr[i+1] = this.g
- arr[i+2] = this.b
- }
- h1e.mask_image = function(img, mask)
- {
- h1e.checkdom(img)
- h1e.checkobject(mask)
- var w = img.width
- var h = img.height
- var canvas = document.createElement('canvas')
- canvas.width = w
- canvas.height = h
- var ctx = canvas.getContext("2d")
- ctx.drawImage(img, 0, 0)
- var im = ctx.getImageData(0, 0, w, h)
- for(var i=0; i<w*h; i++){
- if(im.data[i*4+3] == 0)
- continue
- if(mask.eqArr(im.data, i*4))
- im.data[i*4+3] = 0
- }
- ctx.putImageData(im, 0, 0)
- var dataurl = canvas.toDataURL()
- var img2 = new Image()
- img2.src = dataurl
- return img2
- }
- h1e.recolor_image = function(img, from, to)
- {
- h1e.checkdom(img)
- h1e.checkobject(from)
- h1e.checkobject(to)
- var w = img.width
- var h = img.height
- var canvas = document.createElement('canvas')
- canvas.width = w
- canvas.height = h
- var ctx = canvas.getContext("2d")
- ctx.drawImage(img, 0, 0)
- var im = ctx.getImageData(0, 0, w, h)
- for(var i=0; i<w*h; i++){
- if(im.data[i*4+3] == 0)
- continue
- if(from.eqArr(im.data, i*4))
- to.setArr(im.data, i*4)
- }
- ctx.putImageData(im, 0, 0)
- var dataurl = canvas.toDataURL()
- var img2 = new Image()
- img2.src = dataurl
- return img2
- }
- /* Misc. */
- window.requestAnimationFrameCompatible = (function(){
- return window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(callback){
- window.setTimeout(callback, 1000/30);
- }
- })()
- h1e.isobject = function(value){
- return !(typeof value !== "object") }
- h1e.isarray = function(value){
- return (typeof(value) == 'object' && value !== null && value instanceof Array) }
- h1e.isstring = function(value){
- return !(typeof value !== "string") }
- h1e.isnumber = function(value){
- return (typeof value === "number" && value === value) }
- h1e.isbool = function(value){
- return (typeof value === "boolean") }
- h1e.isfinite = function(value){
- return !(typeof value !== "number" || !isFinite(value)) }
- h1e.isinteger = function(value){
- return !(typeof value !== "number" || !isFinite(value) || value != Math.floor(value)) }
- h1e.isdom = function(value){
- return h1e.isobject(value) && !!value.nodeType }
- h1e.checkobject = function(value){
- if(!h1e.isobject(value)) throw new Error("Value is not object") }
- h1e.checkarray = function(value){
- if(!h1e.isarray(value)) throw new Error("Value is not array") }
- h1e.checkstring = function(value){
- if(!h1e.isstring(value)) throw new Error("Value is not string") }
- h1e.checknumber = function(value){
- if(!h1e.isnumber(value)) throw new Error("Value is not number") }
- h1e.checkbool = function(value){
- if(!h1e.isbool(value)) throw new Error("Value is not bool") }
- h1e.checkfinite = function(value){
- if(!h1e.isfinite(value)) throw new Error("Value is not a finite number") }
- h1e.checkinteger = function(value){
- if(!h1e.isinteger(value)) throw new Error("Value is not integer") }
- h1e.checkdom = function(value){
- if(!h1e.isdom(value)) throw new Error("Value is not dom") }
- h1e.checkbool_or_undefined = function(value){
- if(!h1e.isbool(value) && value !== undefined)
- throw new Error("Value is not bool or undefined") }
- h1e.assert = function(v){
- if(!v) throw new Error("Assertion failed") }
- h1e.dump = function(arr, dumped_objects){
- if(dumped_objects === undefined)
- var dumped_objects = []
- var dumped_text = ""
- if(typeof(arr) == 'object' && arr === null){
- dumped_text += "null"
- } else if(typeof(arr) == 'object' && arr !== null && arr instanceof Array){
- if(dumped_objects.indexOf(arr) != -1)
- return "(circular reference)"
- dumped_objects.push(arr)
- dumped_text += "["
- var first = true
- for(var i in arr){
- if(!first)
- dumped_text += ","
- first = false
- var value = arr[i]
- dumped_text += h1e.dump(value, dumped_objects)
- }
- dumped_text += "]"
- } else if(typeof(arr) == 'object'){
- if(dumped_objects.indexOf(arr) != -1)
- return "(circular reference)"
- dumped_objects.push(arr)
- dumped_text += "{"
- var first = true
- for(var item in arr){
- if(!first)
- dumped_text += ","
- first = false
- var value = arr[item]
- dumped_text += "'"+item+"':"+h1e.dump(value, dumped_objects)
- }
- dumped_text += "}"
- } else {
- if(typeof(arr) == 'string')
- dumped_text = "\""+arr+"\""
- else if(typeof(arr) == 'number')
- dumped_text = arr
- else if(typeof(arr) == 'undefined')
- dumped_text = "undefined"
- else
- dumped_text = ""+arr+" ("+typeof(arr)+")"
- }
- return dumped_text
- }
- }()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement