diff --git a/index.html b/index.html
index 1fa4973..24591c9 100644
--- a/index.html
+++ b/index.html
@@ -23,8 +23,11 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/scenes/demo.md b/scenes/demo.md
index a38c68f..2e6d2eb 100644
--- a/scenes/demo.md
+++ b/scenes/demo.md
@@ -10,38 +10,50 @@ Oh no!
# demo-attacks
+`publish("beebee",["normal"])`
+
[Attack 10 points](#demo-attack-low)
[Attack 20 points](#demo-attack-med)
[Attack 50%](#demo-attack-hi)
+# attack
+
+`publish("beebee",["scream"])`
+
+`publish("hong",["shock"])`
+
+(...1500)
+
+{{if HP.hong==0}} (#dead) {{/if}}
+
+`publish("hong",["normal"])`
+
+(#demo-attacks)
+
# demo-attack-low
`HP.attackHong("10p")`
-{{if HP.hong==0}} (#dead) {{/if}}
-
-(#demo-attacks)
+(#attack)
# demo-attack-med
`HP.attackHong("20p")`
-{{if HP.hong==0}} (#dead) {{/if}}
-
-(#demo-attacks)
+(#attack)
# demo-attack-hi
`HP.attackHong("50%")`
-{{if HP.hong==0}} (#dead) {{/if}}
-
-(#demo-attacks)
+(#attack)
# dead
+`publish("beebee",["normal_speak"])`
+
i am ded
> u r ded
diff --git a/scripts/game/BGAnxiety.js b/scripts/game/BGAnxiety.js
index e69de29..6146306 100644
--- a/scripts/game/BGAnxiety.js
+++ b/scripts/game/BGAnxiety.js
@@ -0,0 +1,108 @@
+/******************************
+
+A cool floating-squares dark background...
+or maybe CA?
+
+******************************/
+
+function BGAnxiety(){
+
+ var self = this;
+
+ // Moving white boxes
+ var BG_WIDTH = 360;
+ var BG_HEIGHT = 450;
+ self.boxes = [];
+ self.resetBox = function(box, startInView){
+
+ // Random size
+ box.w = box.h = Math.random()*200 + 100;
+
+ // Start in view?
+ if(startInView){
+ // Random position
+ box.x = Math.random()*(BG_WIDTH+box.w*2) - box.w;
+ box.y = Math.random()*(BG_HEIGHT+box.h*2) - box.h;
+ }
+
+ // Move horizontal-only or vertical-only
+ if(Math.random()<0.5){
+ box.velX = (Math.random()>0.5 ? -1 : 1) * (Math.random()*0.8+0.2);
+ box.velY = 0;
+ }else{
+ box.velX = 0;
+ box.velY = (Math.random()>0.5 ? -1 : 1) * (Math.random()*0.8+0.2);
+ }
+
+ // If NOT start in view, use Velocity to determine where to put box
+ if(!startInView){
+
+ // Horizontal
+ if(box.velY==0){
+ box.y = Math.random()*(BG_HEIGHT+box.h*2) - box.h;
+ if(box.velX>0){ // ltr
+ box.x = -box.w;
+ }else{ // rtl
+ box.x = BG_WIDTH;
+ }
+ }
+
+ // Vertical
+ if(box.velX==0){
+ box.x = Math.random()*(BG_WIDTH+box.w*2) - box.w;
+ if(box.velY>0){ // utd
+ box.y = -box.h;
+ }else{ // dtu
+ box.y = BG_HEIGHT;
+ }
+ }
+
+ }
+
+ };
+ self.isBoxOutOfSight = function(box){
+ if(box.x<-box.w) return true;
+ if(box.y<-box.h) return true;
+ if(box.x>BG_WIDTH) return true;
+ if(box.y>BG_HEIGHT) return true;
+ return false;
+ };
+ self.updateBox = function(box){
+
+ // Move it
+ box.x += box.velX;
+ box.y += box.velY;
+
+ // If it's out of sight, reset it
+ if(self.isBoxOutOfSight(box)){
+ self.resetBox(box);
+ }
+
+ };
+ self.drawBox = function(box, ctx){
+ ctx.fillStyle = "rgba(255,255,255,0.03)";
+ ctx.fillRect(box.x, box.y, box.w, box.h);
+ };
+ for(var i=0; i<40; i++){
+ var box = {};
+ self.resetBox(box, true);
+ self.boxes.push(box);
+ }
+
+ self.draw = function(ctx){
+
+ // A big ol' black box
+ ctx.fillStyle = "#111111";
+ ctx.fillRect(0,0, BG_WIDTH, BG_HEIGHT);
+
+ // Moving white boxes
+ self.boxes.forEach(function(box){
+ self.updateBox(box);
+ });
+ self.boxes.forEach(function(box){
+ self.drawBox(box, ctx);
+ });
+
+ };
+
+}
\ No newline at end of file
diff --git a/scripts/game/Beebee.js b/scripts/game/Beebee.js
index 4eac0f8..cadf6cd 100644
--- a/scripts/game/Beebee.js
+++ b/scripts/game/Beebee.js
@@ -8,47 +8,74 @@ function Beebee(){
self.sprite = new Sprite({
image: beebeeImage,
grid:{
- width: 1,
- height: 2
+ width: 2,
+ height: 3
},
frame:{
- width: 720,
- height: 500
+ width: 600,
+ height: 400
},
anchor:{
- x: 300,
- y: 230
+ x: 425/2,
+ y: 325/2
},
frameNames:[
+ "normal_look_phone",
"normal",
- "panic",
- "yay"
+ "normal_speak",
+ "",
+ "scream",
+ "scream_2"
],
- x: 300,
- y: 430,
- rotation: 0,
- scale: 1,
- squash: 1
+ x: 270,
+ y: 405
});
// Draw
- var ticker = 1;
+ var ticker = 0;
self.draw = function(ctx){
- // Bouncing based on frame!
- ticker += 1/20;
- if(self.sprite.currentFrameName == "panic"){
- ticker += 1;
+ var fname = self.sprite.currentFrameName;
+
+ // Normal: Breathe fast!
+ if(fname.substr(0,6) == "normal"){
+ self.sprite.breatheSpeed = 0.8;
+ self.sprite.breatheAmp = 0.01;
+ }
+
+ // Scream: Loop between scream 1/2!
+ if(fname.substr(0,6) == "scream"){
+ self.sprite.breatheSpeed = 0;
+ self.sprite.breatheAmp = 0;
+ if(ticker<=0){
+ ticker=5;
+ if(fname=="scream") self.sprite.gotoFrameByName("scream_2");
+ if(fname=="scream_2") self.sprite.gotoFrameByName("scream");
+ }else{
+ ticker--;
+ }
}
- self.sprite.squash = 1 + Math.sin(ticker)*0.05;
// Draw me!
self.sprite.draw(ctx);
};
- subscribe("beebee", function(frameName){
- self.sprite.gotoFrameByName(frameName);
+ // When going to frames...
+ subscribe("beebee", function(fname){
+
+ self.sprite.gotoFrameByName(fname);
+
+ // Bounce transition
+ self.sprite.bounce = 1.1;
+ if(fname=="scream"){
+ self.sprite.bounce = 1.6;
+ }
+
});
+ // Kill
+ self.kill = function(){
+ };
+
}
\ No newline at end of file
diff --git a/scripts/game/Game.js b/scripts/game/Game.js
index d398733..fa5eb34 100644
--- a/scripts/game/Game.js
+++ b/scripts/game/Game.js
@@ -114,6 +114,9 @@ Game.executeNextLine = function(){
case "code":
promiseNext = Game.executeCode(line);
break;
+ case "wait":
+ promiseNext = Game.executeWait(line);
+ break;
}
// If it's a goto, end THIS section immediately.
@@ -251,6 +254,21 @@ Game.executeCode = function(line){
}
+// Execute wait! Just wait.
+Game.executeWait = function(line){
+
+ // Get integer from (...NN)
+ var waitTime = parseInt(line.match(/^\(\.\.\.(\d+)\)/)[1].trim());
+
+ // Delayed promise
+ var promiseDelayed = new pinkySwear();
+ setTimeout(function(){
+ promiseDelayed(true, []);
+ }, waitTime);
+ return promiseDelayed;
+
+};
+
// Execute goto! Just goto.
Game.executeGoto = function(line){
var gotoID = line.match(/^\(\#(.*)\)/)[1].trim().toLocaleLowerCase();
@@ -272,6 +290,10 @@ Game.getLineType = function(line){
var isCode = /^\`/.test(line);
if(isCode) return "code";
+ // Is it a wait?
+ var isWait = /^\(\.\.\.\d+\)/.test(line);
+ if(isWait) return "wait";
+
// Otherwise, it's text.
return "text";
diff --git a/scripts/game/HP.js b/scripts/game/HP.js
index b5c600c..5faf6f4 100644
--- a/scripts/game/HP.js
+++ b/scripts/game/HP.js
@@ -10,7 +10,7 @@ function HitPoints(){
self.dom = document.querySelector("#game_hp");
self.canvas = document.createElement("canvas");
self.canvas.width = 360 * 2;
- self.canvas.height = 70 * 2;
+ self.canvas.height = 100 * 2;
self.canvas.style.width = self.canvas.width/2 + "px";
self.canvas.style.height = self.canvas.height/2 + "px";
self.context = self.canvas.getContext("2d");
@@ -110,6 +110,10 @@ function HitPoints(){
ctx.save();
ctx.scale(2,2);
+ // Draw BG
+ var sx=0, sy=600, sw=720, sh=200;
+ ctx.drawImage(self.image, sx,sy,sw,sh, 0,0,sw/2,sh/2);
+
// Draw Left & Right Sides
self.drawHalf(ctx, false);
self.drawHalf(ctx, true);
diff --git a/scripts/game/Hong.js b/scripts/game/Hong.js
new file mode 100644
index 0000000..64f27e1
--- /dev/null
+++ b/scripts/game/Hong.js
@@ -0,0 +1,76 @@
+function Hong(){
+
+ var self = this;
+
+ // Sprite!
+ var beebeeImage = new Image();
+ beebeeImage.src = "sprites/hong.png";
+ self.sprite = new Sprite({
+ image: beebeeImage,
+ grid:{
+ width: 3,
+ height: 2
+ },
+ frame:{
+ width: 300,
+ height: 300
+ },
+ anchor:{
+ x: 160/2,
+ y: 225/2
+ },
+ frameNames:[
+ "_body_1",
+ "_body_2",
+ "",
+ "normal",
+ "smile",
+ "shock"
+ ],
+ x: 80,
+ y: 400
+ });
+
+ // Breathe normally
+ self.sprite.breatheSpeed = 0.017;
+ self.sprite.breatheAmp = 0.014;
+
+ // Bounce slow
+ self.sprite.bounceHookes = 0.1;
+ self.sprite.bounceDamp = 0.9;
+
+ // First frame
+ self.sprite.gotoFrameByName("smile");
+
+ // Draw
+ var ticker = 0;
+ self.draw = function(ctx){
+
+ var fname = self.sprite.currentFrameName;
+
+ // Draw body FIRST
+ var bod_frame = (Math.floor(ticker/30)%2 == 0) ? "_body_1" : "_body_2";
+ ticker++;
+ self.sprite.gotoFrameByName(bod_frame);
+ self.sprite.draw(ctx);
+
+ // Draw face next
+ self.sprite.gotoFrameByName(fname);
+ self.sprite.draw(ctx);
+
+ };
+
+ // When going to frames...
+ subscribe("hong", function(fname){
+ self.sprite.gotoFrameByName(fname);
+ self.sprite.bounce = 1.05;
+ if(fname=="shock"){
+ self.sprite.bounce = 1/1.5;
+ }
+ });
+
+ // Kill
+ self.kill = function(){
+ };
+
+}
\ No newline at end of file
diff --git a/scripts/game/SceneSetup.js b/scripts/game/SceneSetup.js
index 5c7f921..15bbe9f 100644
--- a/scripts/game/SceneSetup.js
+++ b/scripts/game/SceneSetup.js
@@ -10,6 +10,15 @@ SceneSetup.demo = function(){
Game.resetScene();
+ // Background
+ var bg = new BGAnxiety();
+ Game.scene.children.push(bg);
+
+ // Hong
+ var hong = new Hong();
+ Game.scene.children.push(hong);
+
+ // Beebee
var beebee = new Beebee();
Game.scene.children.push(beebee);
diff --git a/scripts/game/Sprite.js b/scripts/game/Sprite.js
index 0054f6f..aa736b3 100644
--- a/scripts/game/Sprite.js
+++ b/scripts/game/Sprite.js
@@ -65,6 +65,15 @@ function Sprite(config){
self.scale = config.scale || 1;
self.squash = config.squash || 1;
+ // Helpers
+ self.breathe = 0;
+ self.breatheSpeed = 0;
+ self.breatheAmp = 0;
+ self.bounce = 1;
+ self.bounceVel = 0;
+ self.bounceDamp = 0.8;
+ self.bounceHookes = 0.4;
+
// Draw frame!
self.draw = function(ctx){
@@ -81,9 +90,19 @@ function Sprite(config){
var dy = self.y;
ctx.translate(dx, dy);
+ // Breathe
+ self.breathe += self.breatheSpeed;
+ var breatheSquash = 1 + Math.sin(self.breathe)*self.breatheAmp;
+
+ // Bounce
+ self.bounce += self.bounceVel;
+ self.bounceVel -= (self.bounce-1) * self.bounceHookes;
+ self.bounceVel *= self.bounceDamp;
+
// Scale
- var scaleX = self.scale * self.squash;
- var scaleY = self.scale / self.squash;
+ var totalSquash = self.squash * breatheSquash * self.bounce;
+ var scaleX = self.scale * totalSquash;
+ var scaleY = self.scale / totalSquash;
ctx.scale(scaleX, scaleY);
// Draw it!
diff --git a/sprites/beebee.png b/sprites/beebee.png
index 97626c7..e605a7c 100644
Binary files a/sprites/beebee.png and b/sprites/beebee.png differ
diff --git a/sprites/hong.png b/sprites/hong.png
new file mode 100644
index 0000000..7859371
Binary files /dev/null and b/sprites/hong.png differ
diff --git a/sprites/hp.png b/sprites/hp.png
index 351b5a9..38f828c 100644
Binary files a/sprites/hp.png and b/sprites/hp.png differ
diff --git a/styles/game.css b/styles/game.css
index a30ecc0..470de1b 100644
--- a/styles/game.css
+++ b/styles/game.css
@@ -4,7 +4,7 @@ html,body{
}
body{
margin:0;
- background: #ddd;
+ background: #000;
}
.no_select{
@@ -22,7 +22,7 @@ body{
width: 360px;
height: 600px;
- background: #ccc;
+ background: #2E2E2E;
font-size: 20px;
font-family: Helvetica, Arial, sans-serif;
@@ -75,7 +75,24 @@ body{
opacity: 0;
left: 15px;
transition: all 0.3s ease-in-out;
+
+ /*border: 1px solid #ffffff;*/
}
+/*
+.wolf-bubble:before {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 50%;
+ width: 0;
+ height: 0;
+ border: 16px solid transparent;
+ border-left-color: #ffffff;
+ border-right: 0;
+ margin-top: -16px;
+ margin-right: -16px;
+}
+*/
.wolf-bubble:after {
content: '';
position: absolute;
@@ -99,16 +116,19 @@ body{
position: absolute;
bottom:0;
- background: #666;
+ background: #2E2E2E;
text-align: center;
color: #fff;
font-weight: normal;
}
#game_choices > div{
- margin-bottom:0.5em;
+ padding: 0.25em 0;
cursor: pointer;
}
+#game_choices > div:hover{
+ background: rgba(255,255,255,0.25);
+}
/***********************************/
/***********************************/