diff --git a/assets/sprites/boss.png b/assets/sprites/boss.png new file mode 100644 index 0000000..7c3be75 Binary files /dev/null and b/assets/sprites/boss.png differ diff --git a/assets/sprites/tentacle.png b/assets/sprites/tentacle.png new file mode 100644 index 0000000..2f89a3c Binary files /dev/null and b/assets/sprites/tentacle.png differ diff --git a/data/LevelDatabase.js b/data/LevelDatabase.js index 2f7f46a..d666e78 100644 --- a/data/LevelDatabase.js +++ b/data/LevelDatabase.js @@ -25,6 +25,11 @@ cavern_blank: {background: {image: "cavern", width: 3072}, tint: {rgb: 0xC030C0, }; +LevelDatabase["Boss Test"] = {music: "boss", background: {image: "cavern", width: 3072}, tint: {rgb: 0xB05000, a: 0.8, effect: "MULTIPLY"}, +axes: [{x: 0, y: 0, radius: -512, angle: 0, length: 360, left: [0], right: [0]}], +boss: 1, +rocks: [], keys: [], doors: [], transitions: [], spawn: {axis: 0, position: 1, z: 0}}; + LevelDatabase["Test Level"] = { //tint: {rgb: 0xB05000, a: 0.8, effect: "MULTIPLY"}, // Final boss tint? diff --git a/level/Boss.js b/level/Boss.js new file mode 100644 index 0000000..3bbd343 --- /dev/null +++ b/level/Boss.js @@ -0,0 +1,135 @@ +Boss = function(level, x, y, z, mode, dolphin) { + var boss = Entity(level, x, y, z); + + var arms = []; + var armBbox = { + x: 12, y: 12, z: 12, tag: "tentacle" + }; + for (var i = 0; i < 4; i++) { + var arm = []; + for (var j = 0; j < 10; j++) { + var tentacle = Entity(level, x, y, z); + + tentacle.bbox = armBbox; + + tentacle.momentum = {x: 0, y: 0, z: 0}; + + tentacle.addSprite("spr", Renderer.sprite("tentacle")); + tentacle.currentSprite("spr"); + + arm.push(tentacle); + } + arms.push(arm); + } + + boss.arms = arms; + + boss.addSprite("spr", Renderer.sprite("boss")); + boss.currentSprite("spr"); + + var targets = [ + {x: x+150, y: y, z: z, stick: Math.floor(Math.random(80)+120)}, + {x: x, y: y+150, z: z, stick: Math.floor(Math.random(80)+120)}, + {x: x-150, y: y, z: z, stick: Math.floor(Math.random(80)+120)}, + {x: x, y: y-150, z: z, stick: Math.floor(Math.random(80)+120)}, + ]; + + function positionArm(arm, target) { + // Figure out where the arm starts attached + var base = { + x: target.x - boss.position.x, + y: target.y - boss.position.y, + z: boss.position.z + 70 + }; + + var dist = Math.sqrt(base.x * base.x + base.y * base.y)/70; + base.x /= dist; + base.y /= dist; + base.x += boss.position.x; + base.y += boss.position.y; + + // Set first link to the base, and last link to the target. + var end = arm.length - 1; + arm[0].position.x = base.x; + arm[0].position.y = base.y; + arm[0].position.z = base.z; + arm[end].position.x = target.x; + arm[end].position.y = target.y; + arm[end].position.z = target.z; + + // Do gravity, momentum, and pulling on each link between themselves. + while (end--) { + var one = arm[end]; + var two = arm[end + 1]; + + var xdist = two.position.x - one.position.x; + var ydist = two.position.y - one.position.y; + var zdist = two.position.z - one.position.z; + + dist = Math.sqrt(xdist * xdist + ydist * ydist + zdist * zdist); + + if (dist > 34) { + one.momentum.x += xdist/16; + one.momentum.y += ydist/16; + one.momentum.z += zdist/16; + two.momentum.x -= xdist/16; + two.momentum.y -= ydist/16; + two.momentum.z -= zdist/16; + } + + one.position.x += one.momentum.x; + one.position.y += one.momentum.y; + one.position.z += one.momentum.z; + + one.momentum.x *= 0.9; + one.momentum.y *= 0.9; + one.momentum.z *= 0.9; + one.momentum.z += 0.1; + } + } + + boss.think = function() { + var momx = dolphin.position.x + Math.cos(dolphin.angle) * 250 - boss.position.x; + var momy = dolphin.position.y + Math.sin(dolphin.angle) * 250 - boss.position.y; + var momz = dolphin.position.z - boss.position.z; + momx /= 16; + momy /= 16; + momz /= 16; + + boss.position.x += momx; + boss.position.y += momy; + boss.position.z += momz; + + var offset = level.ticCount; + + targets.forEach(function(t) { + offset += 90; + t.stick--; + if (t.stick < -80) { + t.stick = Math.floor(Math.random() * 100 + 160); + } else if (t.stick == 0) { + var xoffs = -Math.sin(dolphin.angle) * Math.cos(dolphin.activeSprite.rotation) * 70; + var yoffs = Math.cos(dolphin.angle) * Math.cos(dolphin.activeSprite.rotation) * 70; + var zoffs = Math.sin(dolphin.activeSprite.rotation) * 70; + + t.x = boss.position.x + (dolphin.position.x + xoffs - boss.position.x) * 2; + t.y = boss.position.y + (dolphin.position.y + yoffs - boss.position.y) * 2; + t.z = boss.position.z + (dolphin.position.z + zoffs - boss.position.z) * 2; + } else if (t.stick > 0) { + momx = boss.position.x + Math.cos(offset*Math.PI/180) * 150 - t.x; + momy = boss.position.y + Math.sin(offset*Math.PI/180) * 150 - t.y; + momz = boss.position.z - t.z; + + t.x += momx/20; + t.y += momy/20; + t.z += momz/20; + } + }); + + for (var i = 0; i < 4; i++) { + positionArm(arms[i], targets[i]); + } + } + + return boss; +}; \ No newline at end of file diff --git a/level/Dolphin.js b/level/Dolphin.js index ff18fc2..972e597 100644 --- a/level/Dolphin.js +++ b/level/Dolphin.js @@ -64,6 +64,21 @@ Dolphin = function(level, axis, position, z) { collectible.think = collectible.attract; collectible.attractTarget = dolphin; } + + if (dolphin.colliding("tentacle")) { + dolphin.momentum.x *= -1.3; + dolphin.momentum.y *= -1.3; + + while (dolphin.momentum.x * dolphin.momentum.x + dolphin.momentum.y * dolphin.momentum.y > 1000) { + dolphin.momentum.x *= 0.99; + dolphin.momentum.y *= 0.99; + } + + while (dolphin.colliding("tentacle")) { + axisMove(); + vMove(); + } + } }; dolphin.fliptimer = 0; diff --git a/level/Level.js b/level/Level.js index 165aaaa..014fc39 100644 --- a/level/Level.js +++ b/level/Level.js @@ -39,6 +39,9 @@ Level = function(levelName) { tint.scale.set(500/8, 280/8); } + // Boss + var boss; + // Wipe in/out graphic var wipe = level.wipe = new PIXI.Graphics(); wipe.beginFill(0x000000); @@ -139,6 +142,24 @@ Level = function(levelName) { crystal.save = true; placeEntityInGrid(crystal); } + + // Boss. + if (level.map.boss) { + boss = Boss( + level, + dolphin.position.x + Math.cos(dolphin.angle) * 250, + dolphin.position.y + Math.sin(dolphin.angle) * 250, + dolphin.position.z, + level.map.boss, + dolphin + ); + placeEntityInGrid(boss); + boss.arms.forEach(function(arm) { + arm.forEach(function(piece) { + placeEntityInGrid(piece); + }); + }); + } } level.think = function() {