commit 771f354d74118ffae715ad3e4228f992513cb2de Author: OriginalUsername843 Date: Tue May 26 12:19:08 2026 -0600 Initial Commit diff --git a/games.html b/games.html new file mode 100644 index 0000000..740f855 --- /dev/null +++ b/games.html @@ -0,0 +1,165 @@ + + + + + + angry.hair | Game Server Fury + + + + + + + + + + + + + +
+
+
+

+ Self-Hosted Game Servers. +

+
+ +
+ +
+
+ Minecraft +
+
+
+ IP: angry.hair
+ Port: DEFAULT
+ Client Compatibility: Use either Java or Bedrock clients +
+
+ Status: ONLINE
+ Players: 0 / 50
+ Version: 1.20.4 (Paper) +
+
+
+ +
+
+ World of Warcraft +
+
+
+ Account creation and instructions: CLICK HERE +
+
+ Status: ONLINE
+ Expansion: Wrath of the Lich King (3.3.5a)
+ Server: wow.angry.hair
+ Realm: Angry Haircraft +
+
+
+ +
+
+ BF1942 + Desert Combat
+ +
+
+ IP: angry.hair:14567
+ Install DC Final + hotfixes. Pure rage. +
+
+ Mod: Desert Combat 0.7
+ Map: Baghdad Nights
+ Status: OFFLINE +
+
+
+ +
+
+ Unreal Tournament 2004
+ +
+
+ IP: angry.hair:7777
+ Patch to 3369. All bots. Pure skill. +
+
+ Mode: CTF
+ Map: Face3
+ Status: ONLINE +
+
+
+ +
+
+ Valheim +
+
+
+ IP: angry.hair:2456
+ Password: badhairday
+ Vanilla+ mods. Vikings welcome. +
+
+ World: FuryViking
+ Seed: ANGRYHAIR
+ Status: OFFLINE +
+
+
+
+ + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..602f080 --- /dev/null +++ b/index.html @@ -0,0 +1,43 @@ + + + + + + angry.hair | Self-hosted Server Fury + + + + + + + + + + + + +
+
+
+

+ Self-Hosted Stuff. +

+
+ +
+ +
+ + + + + + diff --git a/index.html.251031 b/index.html.251031 new file mode 100644 index 0000000..6a0dd66 --- /dev/null +++ b/index.html.251031 @@ -0,0 +1,322 @@ + + + + + + angry.hair | Game Server Fury + + + + + + + + + + + + +
+
+
+

+ Self-Hosted Servers. +

+
+ +
+
+ +
+
Minecraft
+
+ Version: 1.20.4 (Paper)
+ Players: 3000 / 20
+ Status: ONLINE +
+ CONNECT +
+ IP: angry.hair
+ Port: DEFAULT
+ Request an invite: Mail david.n.mitchell@gmail.com
+ Use either Java or Bedrock clients +
+
+ + +
+
World of Warcraft
+
+ Expansion: Wrath of the Lich King
+ Realm: Angry Haircraft
+ Status: ONLINE +
+ DOWNLOAD CLIENT + DOWNLOAD CLIENT (HD) +
+ 1. Email Dave to request an account:
+  - include your preferred username
+  - include the password that you will use
+ 2. You will get a password in the email response so you can download one of the clients above
+ 3. Unzip client, run wow.exe, and use credentials from email
+ 4. ???
+ 5. Profit +
+
+ + +
+
BF1942 + Desert Combat
+
+ Mod: Desert Combat 0.7
+ Map: Baghdad Nights
+ Status: ONLINE +
+ JOIN SERVER +
+ IP: angry.hair:14567
+ Install DC Final + hotfixes. Pure rage. +
+
+ + +
+
UT2004
+
+ Mode: Onslaught
+ Map: ONS-Torlan
+ Status: ONLINE +
+ LAUNCH +
+ IP: angry.hair:7777
+ Patch to 3369. All bots. Pure skill. +
+
+ + +
+
Valheim
+
+ World: FuryViking
+ Seed: ANGRYHAIR
+ Status: ONLINE +
+ JOIN WORLD +
+ IP: angry.hair:2456
+ Password: badhairday
+ Vanilla+ mods. Vikings welcome. +
+
+
+
+ + + + + + diff --git a/index.html.old b/index.html.old new file mode 100644 index 0000000..c8bd906 --- /dev/null +++ b/index.html.old @@ -0,0 +1,15 @@ + + + + + + Angry Hair + + +
+

Angery Hair

+ Winders +
+ + + diff --git a/lib/codef_core.js b/lib/codef_core.js new file mode 100644 index 0000000..746b489 --- /dev/null +++ b/lib/codef_core.js @@ -0,0 +1,649 @@ +/*------------------------------------------------------------------------------ +Copyright (c) 2011 Antoine Santo Aka NoNameNo + +This File is part of the CODEF project. + +More info : http://codef.santo.fr +Demo gallery http://www.wab.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. +------------------------------------------------------------------------------*/ + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(/* function */ callback, /* DOMElement */ element){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +/** + Create a new canvas object.
+ canvas(w, h, divname)
+ + @class canvas + @param {Number in pixel} w The Width of the canvas you want to create. + @param {Number in pixel} h The Height of the canvas you want to create. + @param {String} [divname] The div id you want the create the canvas to. If not specified, the canvas will be hidden. + @property {Number in pixel} width The Width of the canvas. + @property {Number in pixel} height The Height of the canvas. + @property {Object} canvas object of this canvas. ;) + @property {Object} contex the 2d context of this canvas. + @property {Number in pixel} handlex the x coord of the handle (0 by default). + @property {Number in pixel} handley the y coord of the handle (0 by default). + @property {Number in pixel} tilew the Width of a tile (IF this canvas is a tileset). + @property {Number in pixel} tileh the Height of a tile (IF this canvas is a tileset). + @property {Number} tilestart the number of the first tile (usefull for tileset like font). + @example + var mycanvas = new canvas(640, 480, "main"); + +*/ +function canvas(w, h, divname){ + this.width=w; + this.height=h; + this.canvas; + this.contex; + this.canvas = document.createElement("canvas"); + if(divname) document.getElementById(divname).appendChild(this.canvas); + this.canvas.setAttribute('width', w); + this.canvas.setAttribute('height', h); + this.canvas.id="maincanvas"; + this.contex = this.canvas.getContext('2d'); + + this.handlex=0; + this.handley=0; + this.midhandled=false; + this.tilew=0; + this.tileh=0; + this.tilestart=0; + + /** + Fill the canvas.
+ canvas.fill(color)
+ + @function canvas.fill + @param {Color} color The color you want to fill the canvas with. + @example + mycanvas.fill('#FF0000'); + */ + this.fill = function(color){ + var tmp = this.contex.fillStyle; + var tmp2= this.contex.globalAlpha; + this.contex.globalAlpha=1; + this.contex.fillStyle = color; + this.contex.fillRect (0, 0, this.canvas.width, this.canvas.height); + this.contex.fillStyle = tmp + this.contex.globalAlpha=tmp2; + } + + /** + Clear the canvas.
+ + @function canvas.clear + @example + mycanvas.clear(); + */ + this.clear = function(){ + this.contex.clearRect (0, 0, this.canvas.width, this.canvas.height); + } + + /** + Draw a plot on the canvas.
+ canvas.plot(x1,y1,width,color)
+ + @function canvas.plot + @param {Number in pixel} x The x coord you want to plot in the canvas. + @param {Number in pixel} y The y coord you want to plot in the canvas. + @param {Number in pixel} width The size of the plot. + @param {Color} color The color of the plot. + @example + mycanvas.plot(20,20,50,'#FF0000'); + */ + this.plot = function(x,y,width,color){ + // save old fillstyle + var oldcolor = this.contex.fillStyle ; + + this.contex.fillStyle=color; + this.contex.fillRect(x,y,width,width) ; + + // restore old fillstyle + this.contex.fillStyle=oldcolor; + } + + /** + Draw a line on the canvas.
+ canvas.line(x1,y1,x2,y2,width,color)
+ + @function canvas.line + @param {Number in pixel} x1 The x coord of the line start in the canvas. + @param {Number in pixel} y1 The y coord of the line start in the canvas. + @param {Number in pixel} x2 The x coord of the line end in the canvas. + @param {Number in pixel} y2 The y coord of the line end in the canvas. + @param {Number in pixel} width The width of the line. + @param {Color} color The color of the plot. + @example + mycanvas.line(0,0,50,50,2,'#FF0000'); + */ + this.line = function(x1,y1,x2,y2,width,color){ + var tmp=this.contex.strokeStyle; + this.contex.strokeStyle=color; + this.contex.lineWidth=width; + this.contex.beginPath(); + this.contex.moveTo(x1,y1); + this.contex.lineTo(x2,y2); + this.contex.stroke(); + this.contex.closePath(); + this.contex.strokeStyle=tmp; + } + + /** + Draw a filled triangle on the canvas.
+ canvas.triangle(x1,y1,x2,y2,x3,y3,color)
+ + @function canvas.triangle + @param {Number in pixel} x1 The x coord of the 1st edge of the triangle in the canvas. + @param {Number in pixel} y1 The y coord of the 1st edge of the triangle in the canvas. + @param {Number in pixel} x2 The x coord of the 2nd edge of the triangle in the canvas. + @param {Number in pixel} y2 The y coord of the 2nd edge of the triangle in the canvas. + @param {Number in pixel} x3 The x coord of the 3rd edge of the triangle in the canvas. + @param {Number in pixel} y3 The y coord of the 3rd edge of the triangle in the canvas. + @param {Color} color The color of the plot. + @example + mycanvas.triangle(150,150,250,250,50,250,'#FF0000'); + */ + this.triangle = function(x1,y1,x2,y2,x3,y3,color){ + this.contex.beginPath(); + this.contex.moveTo(x1,y1); + this.contex.lineTo(x2,y2); + this.contex.lineTo(x3,y3); + this.contex.closePath(); + this.contex.fillStyle=color; + this.contex.fill(); + } + + /** + Draw a filled quad on the canvas.
+
+ it can be used with 5 params :
+ canvas.quad(x1,y1,w,h,color)
+
+ or it can be used with 9 params :
+ canvas.quad(x1,y1,x2,y2,x3,y3,x4,y4,color)
+ @function canvas.quad + @param {Number in pixel} x1 The x coord of the 1st edge of the quad in the canvas. + @param {Number in pixel} y1 The y coord of the 1st edge of the quad in the canvas. + @param {Number in pixel} x2 The x coord of the 2nd edge of the quad in the canvas. + @param {Number in pixel} y2 The y coord of the 2nd edge of the quad in the canvas. + @param {Number in pixel} x3 The x coord of the 3rd edge of the quad in the canvas. + @param {Number in pixel} y3 The y coord of the 3rd edge of the quad in the canvas. + @param {Number in pixel} x4 The x coord of the 4th edge of the quad in the canvas. + @param {Number in pixel} y4 The y coord of the 4th edge of the quad in the canvas. + @param {Number in pixel} w The Width of the quad in the canvas. + @param {Number in pixel} h The Height of the quad in the canvas. + @param {Color} color The color of the plot. + @example + mycanvas.quad(150,150,250,250,'#FF0000'); + or + mycanvas.quad(0,150,300,150,250,250,50,250,'#FF0000'); + */ + this.quad = function(x1,y1,x2,y2,x3,y3,x4,y4,color){ + // save old fillstyle + var oldcolor = this.contex.fillStyle ; + + // if x1 y1 width height color + if(arguments.length==5){ + this.contex.fillStyle=x3; + this.contex.fillRect(x1,y1,x2,y2) ; + } + // if all quad coordinates + else{ + this.contex.beginPath(); + this.contex.moveTo(x1,y1); + this.contex.lineTo(x2,y2); + this.contex.lineTo(x3,y3); + this.contex.lineTo(x4,y4); + this.contex.closePath(); + this.contex.fillStyle=color; + this.contex.fill(); + } + // restore old fillstyle + this.contex.fillStyle=oldcolor; + } + + /** + Init a tileset canvas.
+ canvas.initTile(tilew,tileh, tilestart)
+ + @function canvas.initTile + @param {Number in pixel} tilew The Width of one tile. + @param {Number in pixel} tileh The Height of one tile. + @param {Number} [tilestart] The number of the first tile. (0 by default) + @example + mycanvas.initTile(32,32); + */ + this.initTile=function(tilew,tileh, tilestart){ + this.tileh=tileh; + this.tilew=tilew; + if(typeof(tilestart)!='undefined') + this.tilestart=tilestart; + } + + /** + Draw the canvas to another canvas.
+ canvas.draw(dst,x,y,alpha, rot,w,h)
+ + @function canvas.draw + @param {Object} dst The destination canvas. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord). + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [w] The normalized zoom factor on x (1 by default). + @param {Number} [h] The normalized zoom factor on y (1 by default). + @example + mycanvas.draw(destcanvas,10,10,1,0,1,1); + */ + this.draw = function(dst,x,y,alpha, rot,w,h){ + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + if(arguments.length==3 || arguments.length==4) + dst.contex.drawImage(this.canvas, x-this.handlex,y-this.handley); + else if(arguments.length==5){ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.canvas, 0,0); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else{ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.scale(w,h); + dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.canvas, 0,0); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + dst.contex.globalAlpha=tmp; + } + + /** + Draw a tile from this canvas to another canvas.
+ canvas.drawTile(dst, nb, x, y, alpha, rot, w, h)
+ + @function canvas.drawTile + @param {Object} dst The destination canvas. + @param {Number} nb the tile number. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord). + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [w] The normalized zoom factor on x (1 by default). + @param {Number} [h] The normalized zoom factor on y (1 by default). + @example + mycanvas.drawTile(destcanvas,5,10,10,1,0,1,1); + */ + this.drawTile = function(dst, nb, x, y, alpha, rot, w, h){ + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + this.drawPart(dst,x,y,Math.floor((nb%(this.canvas.width/this.tilew)))*this.tilew,Math.floor(nb/(this.canvas.width/this.tilew))*this.tileh,this.tilew,this.tileh,alpha, rot, w, h); + dst.contex.globalAlpha=tmp; + + } + + /** + Draw a part of this canvas to another canvas.
+ canvas.drawPart(dst,x,y,partx,party,partw,parth,alpha, rot,zx,zy)
+ + @function canvas.drawPart + @param {Object} dst The destination canvas. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord). + @param {Number in pixel} partx The x coord of the part in the source canvas. + @param {Number in pixel} party The y coord of the part in the source canvas. + @param {Number in pixel} partw The width of the part in the source canvas. + @param {Number in pixel} parth The height of the part in the source canvas. + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [zx] The normalized zoom factor on x (1 by default). + @param {Number} [zy] The normalized zoom factor on y (1 by default). + @example + mycanvas.drawTile(mycanvas,10,10,0,0,50,50,1,0,1,1); + */ + this.drawPart = function(dst,x,y,partx,party,partw,parth,alpha, rot,zx,zy){ + if(partx<0) { + x-=partx/(this.midhandled==true?2:1); + partw+=partx; + partx=0; + } else { + if (this.midhandled==false) { + partw = Math.min(partw,this.width-partx); + } + } + if(party<0) { + y-=party/(this.midhandled==true?2:1); + parth+=party; + party=0; + } else { + if (this.midhandled==false) { + parth = Math.min(parth,this.height-party); + } + } + if(partw<=0 || parth<=0){ + return; + } + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + if(arguments.length==7 || arguments.length==8){ + dst.contex.translate(x,y); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.canvas,partx,party,partw,parth,0,0,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else if(arguments.length==9){ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.canvas,partx,party,partw,parth,0,0,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else{ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.scale(zx,zy); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.canvas,partx,party,partw,parth,0,0,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + dst.contex.globalAlpha=tmp; + } + + /** + Set the handle coord of this canvas to the center.
+ + @function canvas.setmidhandle + @example + mycanvas.setmidhandle(); + */ + this.setmidhandle=function(){ + this.handlex=parseInt(this.canvas.width/2); + this.handley=parseInt(this.canvas.height/2); + this.midhandled=true; + } + + /** + Set the handle of the canvas.
+ canvas.sethandle(x,y)
+ + @function canvas.sethandle + @param {Number in pixel} x The x coord of the handle of the canvas. + @param {Number in pixel} y The y coord of the handle of the canvas. + @example + mycanvas.sethandle(50,50); + */ + this.sethandle=function(x,y){ + this.handlex=x; + this.handley=y; + this.midhandled=false; + } + + this.print=function(dst, str, x, y, alpha, rot, w, h){ + for(var i=0; iCreate an image object and load a remote/local png/gif/jpg in it.
+ image(img)
+ + @class image + @param {string} img local or url to an jpg/png/gif image. + @property {Object} img the dom image object. + @property {Number in pixel} handlex the x coord of the handle (0 by default). + @property {Number in pixel} handley the y coord of the handle (0 by default). + @property {Number in pixel} tilew the Width of a tile (IF this canvas is a tileset). + @property {Number in pixel} tileh the Height of a tile (IF this canvas is a tileset). + @property {Number} tilestart the number of the first tile (usefull for tileset like font). + @example + // with a local file + var mylogo = new image('logo.png'); + + // with a remote image + var mylogo = new image('http://www.myremotesite.com/logo.png'); + +*/ +function image(img){ + this.img = new Image(); + this.img.src=img; + this.handlex=0; + this.handley=0; + this.midhandled=false; + this.tilew=0; + this.tileh=0; + this.tilestart=0; + + /** + Init a tileset image.
+ image.initTile(tilew,tileh, tilestart)
+ + @function image.initTile + @param {Number in pixel} tilew The Width of one tile. + @param {Number in pixel} tileh The Height of one tile. + @param {Number} [tilestart] The number of the first tile. (0 by default) + @example + myimage.initTile(32,32); + */ + this.initTile=function(tilew,tileh,tilestart){ + this.tileh=tileh; + this.tilew=tilew; + if(typeof(tilestart)!='undefined') + this.tilestart=tilestart; + + } + +/** + Draw the image to a canvas.
+ image.draw(dst,x,y,alpha, rot,w,h)
+ + @function image.draw + @param {Object} dst The destination canvas. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord of the image). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord of the image). + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [w] The normalized zoom factor on x (1 by default). + @param {Number} [h] The normalized zoom factor on y (1 by default). + @example + myimage.draw(destcanvas,10,10,1,0,1,1); + */ + this.draw = function(dst,x,y,alpha, rot,w,h){ + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + if(arguments.length==3 || arguments.length==4) + dst.contex.drawImage(this.img, x-this.handlex,y-this.handley); + else if(arguments.length==5){ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.img, 0,0); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else{ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.scale(w,h); + dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.img, 0,0); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + dst.contex.globalAlpha=tmp; + } + + /** + Draw a tile from this image to a canvas.
+ image.drawTile(dst, nb, x, y, alpha, rot, w, h)
+ + @function image.drawTile + @param {Object} dst The destination canvas. + @param {Number} nb the tile number. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord of the image). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord of the image). + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [w] The normalized zoom factor on x (1 by default). + @param {Number} [h] The normalized zoom factor on y (1 by default). + @example + myimage.drawTile(destcanvas,5,10,10,1,0,1,1); + */ + this.drawTile = function(dst, nb, x, y, alpha, rot, w, h){ + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + this.drawPart(dst,x,y,Math.floor((nb%(this.img.width/this.tilew)))*this.tilew,Math.floor(nb/(this.img.width/this.tilew))*this.tileh,this.tilew,this.tileh,alpha, rot, w, h); + dst.contex.globalAlpha=tmp; + + } + + /** + Draw a part of this image to a canvas.
+ image.drawPart(dst,x,y,partx,party,partw,parth,alpha, rot,zx,zy)
+ + @function image.drawPart + @param {Object} dst The destination canvas. + @param {Number in pixel} x The x coord in the destination canvas (based on the handle coord of the image). + @param {Number in pixel} y The y coord in the destination canvas (based on the handle coord of the image). + @param {Number in pixel} partx The x coord of the part in the source canvas. + @param {Number in pixel} party The y coord of the part in the source canvas. + @param {Number in pixel} partw The width of the part in the source canvas. + @param {Number in pixel} parth The height of the part in the source canvas. + @param {Number} [alpha] The normalized value of the alpha (1 by default). + @param {Number} [rot] The rotation angle in degrees (0 by default) (will use the handle coord as rotation axis). + @param {Number} [zx] The normalized zoom factor on x (1 by default). + @param {Number} [zy] The normalized zoom factor on y (1 by default). + @example + myimage.drawTile(mycanvas,10,10,0,0,50,50,1,0,1,1); + */ + this.drawPart = function(dst,x,y,partx,party,partw,parth,alpha, rot,zx,zy){ + if(partx<0) { + x-=partx/(this.midhandled==true?2:1); + partw+=partx; + partx=0; + } else { + if (this.midhandled==false) { + partw = Math.min(partw,this.img.width-partx); + } + } + if(party<0) { + y-=party/(this.midhandled==true?2:1); + parth+=party; + party=0; + } else { + if (this.midhandled==false) { + parth = Math.min(parth,this.img.height-party); + } + } + if(partw<=0 || parth<=0){ + return; + } + var tmp=dst.contex.globalAlpha; + if(typeof(alpha)=='undefined') alpha=1; + dst.contex.globalAlpha=alpha; + if(arguments.length==7 || arguments.length==8){ + dst.contex.translate(x,y); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.img,partx,party,partw,parth,null,null,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else if(arguments.length==9){ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.img,partx,party,partw,parth,null,null,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + else{ + dst.contex.translate(x,y); + dst.contex.rotate(rot*Math.PI/180); + dst.contex.scale(zx,zy); + if(this.midhandled==true) dst.contex.translate(-partw/2,-parth/2); else dst.contex.translate(-this.handlex,-this.handley); + dst.contex.drawImage(this.img,partx,party,partw,parth,null,null,partw,parth); + dst.contex.setTransform(1, 0, 0, 1, 0, 0); + } + dst.contex.globalAlpha=tmp; + } + + + + /** + Set the handle coord of this image to the center.
+ + @function image.setmidhandle + @example + myimage.setmidhandle(); + */ + this.setmidhandle=function(){ + this.handlex=parseInt(this.img.width/2); + this.handley=parseInt(this.img.height/2); + this.midhandled=true; + } + + /** + Set the handle of the image.
+ image.sethandle(x,y)
+ + @function image.sethandle + @param {Number in pixel} x The x coord of the handle of the image. + @param {Number in pixel} y The y coord of the handle of the image. + @example + myimage.sethandle(50,50); + */ + this.sethandle=function(x,y){ + this.handlex=x; + this.handley=y; + this.midhandled=false; + } + + this.print=function(dst, str, x, y, alpha, rot, w, h){ + for(var i=0; i y) ? 1 : 0)); +} + +function sortPosy(a, b) { + var x = a.posy; + var y = b.posy; + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); +} + +function scrolltext_horizontal(){ + this.scroffset=0; + this.oldspeed=0; + this.speed=1; + this.font; + this.letters = new Object(); + this.scrtxt=" "; + this.pausetimer=0; + this.pausedelay=0; + + this.init = function(dst, font,speed,sinparam,type){ + this.speed=speed; + this.dst=dst; + this.font=font; + this.fontw = this.font.tilew; + this.fonth = this.font.tileh; + this.fontstart = this.font.tilestart; + this.wide=Math.ceil(this.dst.canvas.width/this.fontw)+1; + for(i=0;i<=this.wide;i++){ + this.letters[i]=new ltrobj(Math.ceil((this.wide*this.fontw)+i*this.fontw),0,this.scrtxt.charCodeAt(this.scroffset)); + this.scroffset++; + } + if(typeof(sinparam)!='undefined') + this.sinparam=sinparam; + if(typeof(type)=='undefined') + this.type=0; + else + this.type=type; + } + + this.draw = function(posy){ + var prov = 0; + var temp = new Array(); + var tmp=this.dst.contex.globalAlpha; + this.dst.contex.globalAlpha=1; + var oldvalue=new Array(); + var i; + if(typeof(this.sinparam)!='undefined'){ + for(var j=0;j this.scrtxt.length-1) + this.scroffset=0; + } + } + } + if(typeof(this.sinparam)!='undefined'){ + for(var j=0;j this.scrtxt.length-1) + this.scroffset=0; + } + } + } + if(typeof(this.sinparam)!='undefined'){ + for(var j=0;j li > ul { + margin-left: 10px; + } + + .glitch { + position: relative; + display: inline-block; + color: var(--hair); + font-weight: bold; + font-size: 2.5rem; + letter-spacing: 2px; + text-shadow: + 2px 2px 0 #ff1a1a, + -2px -2px 0 #ff1a1a, + 0 0 10px rgba(255, 50, 50, 0.8); + animation: glitch 2s infinite; + } + + @keyframes glitch { + 0%, 100% { text-shadow: 2px 2px 0 #ff1a1a, -2px -2px 0 #ff1a1a, 0 0 10px rgba(255,50,50,0.8); } + 14% { text-shadow: -2px -2px 0 #ff1a1a, 2px 2px 0 #ff1a1a, 0 0 15px rgba(255,50,50,1); } + 15% { text-shadow: 3px -3px 0 #ff1a1a, -3px 3px 0 #ff1a1a, 0 0 20px rgba(255,50,50,1); } + 16% { text-shadow: none; } + 17% { text-shadow: 2px 2px 0 #ff1a1a, -2px -2px 0 #ff1a1a, 0 0 10px rgba(255,50,50,0.8); } + } + + header { + text-align: center; + padding: 0rem 1rem; + background: linear-gradient(to bottom, #1a0000, var(--bg2)); + border-bottom: 3px dashed var(--accent); + position: fixed; + top:0; + left:0; + z-index:1; + width:100%; + backdrop-filter: blur(10px); + overflow: hidden; + } + + header::before { + content: ""; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + background: repeating-linear-gradient( + 45deg, + transparent, + transparent 10px, + rgba(255, 50, 50, 0.05) 10px, + rgba(255, 50, 50, 0.05) 20px + ); + pointer-events: none; + } + + h1 { + font-size: 3.5rem; + margin-bottom: 0.5rem; + color: var(--hair); + } + + .tagline { + font-size: 1.3rem; + color: #ff6666; + text-transform: uppercase; + letter-spacing: 3px; + margin-top: 1rem; + } + + main { + max-width: 900px; + margin: 1rem auto; + padding: 0 1rem; + } + + .grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1.5rem; + margin-top: 15rem; + } + + .game-card { + background: var(--card); + border: 2px solid var(--accent); + border-radius: 8px; + padding: 1.5rem; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + box-shadow: 0 0 15px var(--shadow); + } + + .game-card:hover { + transform: translateY(-8px); + box-shadow: 0 0 25px rgba(255, 50, 50, 0.6); + border-color: #ff6666; + } + + .game-card::before { + content: "🔥"; + position: absolute; + top: -10px; + right: -10px; + font-size: 2rem; + opacity: 0.3; + transform: rotate(15deg); + } + + .game-title { + font-size: 1.5rem; + color: var(--hair); + margin-bottom: 0.5rem; + font-weight: bold; + text-transform: uppercase; + } + + .game-info { + margin-top: 1rem; + font-size: 0.95rem; + color: var(--text-muted); + } + + .fancy-btn { + display: inline-block; + background: linear-gradient(to bottom, #1a0000, var(--bg2)); + color: white; + padding: 0.6rem 1.2rem; + border-radius: 4px; + text-decoration: none; + font-weight: bold; + font-size: 1.2rem; + transition: 0.3s; + margin-top: 0.5rem; + box-shadow: 0 0 10px rgba(255, 26, 26, 0.5); + text-align:center; + user-select: none; + } + + .fancy-btn h1 { + font-size: 10rem; + } + + .fancy-btn:hover { + background: #ff3333; + transform: scale(1.05); + box-shadow: 0 0 20px rgba(255, 51, 51, 0.8); + } + + .fancy-btn:active { + transform: scale(0.95); + } + + .instructions { + font-size: 0.85rem; + background: rgba(255, 50, 50, 0.1); + padding: 0.8rem; + border-left: 3px solid var(--hair); + border-radius: 0 4px 4px 0; + } + + footer { + text-align: center; + padding: 2rem 1rem; + margin-top: 3rem; + color: #993333; + font-size: 0.9rem; + border-top: 1px dashed var(--accent); + } + + .hair-rage { + font-size: 1.8rem; + animation: rage 1.5s infinite; + } + + @keyframes rage { + 0%, 100% { transform: rotate(0deg); } + 25% { transform: rotate(5deg); } + 75% { transform: rotate(-5deg); } + } + + @media (max-width: 600px) { + h1 { font-size: 2.5rem; } + .glitch { font-size: 2rem; } + .grid { grid-template-columns: 1fr; } + } + + /* ----- Accordion container ----- */ + .game-section { + border: 1px solid #ccc; + margin-bottom: 1rem; + border-radius: 6px; + overflow: hidden; + background: var(--card); + border: 2px solid var(--accent); + border-radius: 8px; + padding: 1.5rem; + transition: all 0.3s ease; + box-shadow: 0 0 15px var(--shadow); + position: relative; + } + + .game-header::before { + content: "🔥"; + position: absolute; + top: -10px; + right: -10px; + font-size: 2rem; + opacity: 0.3; + transform: rotate(15deg); + } + + /* ----- Header (clickable) ----- */ + .game-header { + padding: 1rem; + cursor: pointer; + font-weight: bold; + display: flex; + justify-content: space-between; + align-items: center; + user-select: none; + transition: background 0.2s; + font-size: 125%; + } + .game-header:hover { background: #040404; } + + .game-header::after { + content: "▼"; + font-size: 0.8rem; + transition: transform 0.25s; + } + .game-section.open .game-header::after { + transform: rotate(180deg); + } + + /* ----- Content (hidden by default) ----- */ + .game-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.35s ease; + padding: 0 1rem; + } + .game-section.open .game-content { + max-height: 1500px; /* big enough for any realistic content */ + padding: 1rem; + }