diff --git a/index.html b/index.html
index 3a1be82..45cd01b 100644
--- a/index.html
+++ b/index.html
@@ -267,6 +267,7 @@
+
@@ -291,6 +292,8 @@
+
+
diff --git a/scenes/act2_test.md b/scenes/act2_test.md
deleted file mode 100644
index 649c11d..0000000
--- a/scenes/act2_test.md
+++ /dev/null
@@ -1,256 +0,0 @@
-# act2
-
-`SceneSetup.act2();`
-
-a: hack
-
-(#act2-preamble-end)
-
-
-# act2-preamble-end
-
-```
-Game.clearText();
-publish("act2-out-1");
-music(null, {fade:1});
-```
-
-(...3000)
-
-```
-music('battle', {volume:0.5});
-publish("hp_show");
-```
-
-n: ROUND TWO: *FIGHT!*
-
-```
-bb({
- body: "cry_6",
- mouth: "right",
- eyes: "cry_r_3"
-});
-hong({
- body:"defeated"
-});
-```
-
-b: I just... all I want is for you to be patient with me.
-
-```
-bb({
- eyes: "cry_r_4"
-});
-hong({
- body:"listen"
-});
-```
-
-r: Hey.
-
-```
-Game.clearText();
-publish("act2-in-2");
-publish("hp_hide");
-music('party1', {volume:0.4, fade:2});
-```
-
-(...1300)
-
-r: Looks like you're caught in a fight with yourself, kid.
-
-```
-publish("act2", ["party_hunter",12]);
-publish("act2", ["party_hong",24]);
-```
-
-r: Bottoms up, motherfucker.
-
-```
-hong({
- body:"hold",
- eyes:"blank"
-});
-bb({
- body:"normal",
- mouth:"small",
- eyes:"wat"
-});
-Game.clearText();
-publish("act2-out-3");
-publish("hp_show");
-```
-
-(...3500)
-
-b: I'm so sorry, human.
-
-b: I'm going to have to use my SPECIAL ATTACK
-
-```
-music('battle', {volume:0.5});
-bb({body:"special_a"});
-```
-
-`Game.OVERRIDE_CHOICE_SPEAKER = "fear_harm"`
-
-[](#act2h_attack) `_.SPECIAL_ATTACK="harm"; Game.OVERRIDE_CHOICE_LINE=true`
-
-`Game.OVERRIDE_CHOICE_SPEAKER = "fear_alone"`
-
-[](#act2h_attack) `_.SPECIAL_ATTACK="alone"; Game.OVERRIDE_CHOICE_LINE=true`
-
-`Game.OVERRIDE_CHOICE_SPEAKER = "fear_bad"`
-
-[](#act2h_attack) `_.SPECIAL_ATTACK="bad"; Game.OVERRIDE_CHOICE_LINE=true`
-
-# act2h_attack
-
-```
-bb({body:"special_b_1"});
-```
-
-h: What's this crap?
-
-h: You're gonna yap more stupid words at me again to try t--
-
-```
-bb({body:"special_c"});
-sfx("hadouken");
-```
-
-(...901)
-
-(#act2i)
-
-# act2i
-
-```
-publish("show_special_attack");
-Game.FORCE_CANT_SKIP = true;
-music(null);
-stopAllSounds();
-```
-
-(...5000)
-
-```
-hong({
- body:"final",
- mouth:"final"
-});
-bb({
- body:"normal",
- mouth:"normal",
- eyes:"sad_2"
-});
-attack("100p", _.SPECIAL_ATTACK);
-Game.FORCE_CANT_SKIP = false;
-setTimeout(function(){
- publish("remove_special_attack");
-},30);
-```
-
-(...2500)
-
-h: WHAT THE HELL WAS THAT
-
-b: PUNCH THEM PUNCH THEM PUNCH THEM PUNCH THEM PUNCH THEM PUNCH THEM PUNCH THEM PUNCH THE--
-
-`_.a2_ending = "fight";`
-
-(#act2k)
-
-# act2k
-
-```
-Game.clearText();
-publish("act2-in-4");
-publish("hp_hide");
-music('party1', {volume:0.6, fade:1.5});
-```
-
-(...2200)
-
-r: You alright, kid?
-
-```
-publish("act2", ["party_hunter",19]);
-publish("act2", ["party_hong",36]);
-```
-
-r: I like that. Come to my party next weekend, cutie.
-
-(#act2k_end)
-
-
-
-# act2k_end
-
-```
-Game.clearText();
-publish("act2-out-5");
-music("hum", {fade:2, volume:0.6});
-```
-
-(...2500)
-
-```
-sfx("whoosh");
-publish("act2", ["act2_end",2]);
-```
-
-(...800)
-
-b: Human! Are you okay?!
-
-b: Gosh, that was *close.* We really could've--
-
-```
-Game.clearText();
-publish("act2-outro", ["end3"]);
-music(null);
-sfx("squeak");
-```
-
-(...1500)
-
-```
-publish("act2-outro", ["end4"]);
-sfx("hit");
-```
-
-(...1000)
-
-h: I'm going to the party next weekend.
-
-h: The next time we fight, I'm not just going to *defeat* you...
-
-h: I'm going to fucking *kill* you.
-
-```
-Game.clearText();
-publish("act2-outro", ["end5"]);
-sfx("grass_step1");
-````
-
-(...901)
-
-```
-sfx("grass_step2", {volume:0.8});
-publish("act2-outro", ["end6"]);
-```
-
-(...901)
-
-`sfx("grass_step1", {volume:0.5});`
-
-(...901)
-
-`sfx("grass_step2", {volume:0.25});`
-
-(...3000)
-
-`_.INTERMISSION_STAGE = 2;`
-
-(#intermission)
\ No newline at end of file
diff --git a/scenes/act4.md b/scenes/act4.md
index 9067bbd..8b0e5bd 100644
--- a/scenes/act4.md
+++ b/scenes/act4.md
@@ -2,21 +2,142 @@
```
SceneSetup.act4();
+Game.FORCE_CANT_SKIP = true;
```
-(...5001)
+(...1001)
-`publish("outside-hong", ["walk"])`
+```
+/* (...5001) */
+var hong_frame = _.INJURED ? 9 : 0;
+publish("act4", ["hong_walks_in",hong_frame]);
+```
-(...2001)
+(...666)
-`publish("outside-hong", ["eat"])`
+`publish("act4", ["hong_walks_in", "next"]);`
-(...2001)
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...1667)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...1333)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...167)
+
+`publish("act4_hong_sits");`
+
+(...66)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...133)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1001)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1466)
`publish("act4-out-1");`
-(...2001)
+(...201)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
`Game.FORCE_CANT_SKIP = false;`
@@ -24,7 +145,7 @@ h: *sigh*
h: So what the hell was the moral of this story?
-h: What did we even *learn*? I *was* being stupid, my "friends" *were* using me, and we almost fucking *died*.
+h: What did we even *learn*? I *was* being stupid, my "friends" *were* using me, and we almost goddamn *died*.
{{if _.INJURED}}
[Yeah, not to mention the hospital bill.](#act4a_bill)
@@ -994,6 +1115,8 @@ b: I want to be the alarm for your emotional needs – your needs for safety, be
b: But... I suck at my job, so I need you to train me.
+b: Help me help you.
+
b: Teaching an old dog new tricks *will* take a while. Maybe *years.*
b: And sometimes I'll relapse, I'll slip into my old habits.
diff --git a/scenes/act4_test.md b/scenes/act4_test.md
new file mode 100644
index 0000000..e16ea65
--- /dev/null
+++ b/scenes/act4_test.md
@@ -0,0 +1,514 @@
+# act4
+
+```
+SceneSetup.act4();
+Game.FORCE_CANT_SKIP = true;
+```
+
+(...1001)
+
+```
+/* (...5001) */
+var hong_frame = _.INJURED ? 9 : 0;
+publish("act4", ["hong_walks_in",hong_frame]);
+```
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...1667)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...666)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...1333)
+
+`publish("act4", ["hong_walks_in", "next"]);`
+
+(...167)
+
+`publish("act4_hong_sits");`
+
+(...66)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...133)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1001)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 9]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", 10]);`
+
+(...333)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...1466)
+
+`publish("act4-out-1");`
+
+(...201)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+`publish("act4", ["hong_transition", "next"]);`
+
+(...99)
+
+```
+publish("act4-show-chars");
+Game.FORCE_CANT_SKIP = false;
+```
+
+h: *sigh*
+
+h: Maybe we don't have to fight.
+
+```
+Game.FORCE_CANT_SKIP = true;
+Game.clearText();
+```
+
+(...301)
+
+`publish("smash",[0]);`
+
+(...2001)
+
+```
+publish("smash",[1]);
+sfx("grass_step1");
+```
+
+(...2601)
+
+`publish("smash",[2]);`
+
+(...501)
+
+`Game.FORCE_CANT_SKIP = false;`
+
+(#act4b_2)
+
+# act4b_2
+
+`music('dontfight',{fade:5, volume:0.6})`
+
+b: I'm not a Big Bad Wolf. But I'm not a guard-wolf either.
+
+b: I'm a battered shelter dog.
+
+(#act4c)
+
+
+
+# act4c
+
+```
+Game.clearText();
+music(null,{fade:3});
+```
+
+b: *Can* we really get along?
+
+b: *Can* we work together, as a team?
+
+h: Well,
+
+a: E-excuse me...
+
+```
+Game.clearText();
+publish("act4-in-2");
+music('campus', {volume:0.5, fade:1});
+```
+
+(...2101)
+
+(#act4d)
+
+# act4d
+
+`Game.WORDS_HEIGHT_BOTTOM = 221;`
+
+a: W-wo-would you mind if I sat with you for lunch?
+
+{{if _.TOP_FEAR=="harm"}}
+s: They were sitting alone for lunch? They must be a psycho loner serial killer!
+{{/if}}
+
+{{if _.TOP_FEAR=="alone"}}
+s: Ack, do you know how pathetic we sound? How desperate, how *needy*?
+{{/if}}
+
+{{if _.TOP_FEAR=="bad"}}
+s: They were enjoying peace and quiet, then we interrupted them! We're such a burden!
+{{/if}}
+
+a: I- I mean- it's, it's okay if not, I just...
+
+`Game.OVERRIDE_CHOICE_SPEAKER = "h2"`
+
+[Wait, didn't I see you at the party?](#act4d_recognition)
+
+[Yeah, of course! Come here.](#act4d_yes)
+
+[Sorry, I need alone time right now.](#act4d_no)
+
+# act4d_recognition
+
+h2: Yeah you were on the couch! At the first party I went to,
+
+{{if _.a2_ending=="fight"}}
+h2: The one where I had that panic attack and punched the host.
+{{/if}}
+
+{{if _.a2_ending=="flight"}}
+h2: The one where I had that panic attack and ran out crying.
+{{/if}}
+
+b: Hang on human, we might be making them uncomfortable.
+
+h2: Ah, I don't mean to put you on the spot!
+
+h2: Just remembering a friendly face, is all.
+
+`publish("al-shire", ["panic"]);`
+
+{{if _.TOP_FEAR=="harm"}}
+s: AHHHHH I KNEW IT! THEY'RE A DANGEROUS CRAZY PSYCHO!
+{{/if}}
+
+{{if _.TOP_FEAR=="alone"}}
+s: SEE HOW MUCH WE SUCK AT MAKING FRIENDS?! THE FIRST IMPRESSION WE MADE IS "WITNESSED MY TRAUMA". WE SUCK!
+{{/if}}
+
+{{if _.TOP_FEAR=="bad"}}
+s: AAAHHH WE MADE SOMEONE REMEMBER A TRAUMATIC EVENT. OUR MERE PRESENCE HURTS OTHERS.
+{{/if}}
+
+(#act4e)
+
+# act4d_yes
+
+b: Hang on human, they seem uncomfortable.
+
+h2: Ah, no pressure of course!
+
+h2: Just saying, you can sit here if you want to.
+
+`publish("al-shire", ["panic"]);`
+
+{{if _.TOP_FEAR=="harm"}}
+s: THEY'RE BEING *TOO* FRIENDLY! LIKE TED BUNDY, THE SERIAL KILLER!
+{{/if}}
+
+{{if _.TOP_FEAR=="alone"}}
+s: THEY'RE JUST ACTING NICE. NO ONE *REALLY* WANTS TO BE OUR FRIEND.
+{{/if}}
+
+{{if _.TOP_FEAR=="bad"}}
+s: GAH, WE ALWAYS MAKE OTHERS FEEL UNCOMFORTABLE! WE'RE TERRIBLE!
+{{/if}}
+
+(#act4e)
+
+# act4d_no
+
+b: Hang on human, we might be making them uncomfortable.
+
+h2: Ah, I didn't mean to come off as rude!
+
+{{if _.INJURED}}
+h2: It's just that, well, I jumped off a roof and almost killed myself.
+{{/if}}
+
+{{if !_.INJURED}}
+h2: It's just that, well, I almost jumped off a roof.
+{{/if}}
+
+h2: Please don't take it as a personal rejection, I just need quiet time to process some emotions.
+
+`publish("al-shire", ["panic"]);`
+
+{{if _.TOP_FEAR=="harm"}}
+s: HOLY COW I KNEW IT, THEY *ARE* A DANGEROUS PSYCHO!
+{{/if}}
+
+{{if _.TOP_FEAR=="alone"}}
+s: WE'VE BEEN PERSONALLY REJECTED! WE'LL NEVER BE LOVED!
+{{/if}}
+
+{{if _.TOP_FEAR=="bad"}}
+s: WE INTERRUPTED SOMEONE'S EMOTIONAL PROCESSING! NOW THEY'LL BE TRAUMATIZED FOREVER AND IT'S ALL OUR FAULT!
+{{/if}}
+
+(#act4e)
+
+# act4e
+
+```
+Game.WORDS_HEIGHT_BOTTOM = 195;
+publish("act4", ["alshire", 6]);
+```
+
+s: RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN RUN
+
+```
+Game.clearText();
+publish("act4", ["alshire", 10]);
+```
+
+(...1001)
+
+`publish("act4", ["alshire", 11]);`
+
+(...1001)
+
+```
+publish("act4-out-3");
+Game.WORDS_HEIGHT_BOTTOM = -1; /* reset */
+```
+
+(...1201)
+
+`publish("act4-jumpcut-hong");`
+
+h: Huh. That was weird. I wonder what was going on in their head.
+
+h: Anyway, you were saying?
+
+b: Uh, I forget? Something about teams and work?
+
+h: ¯\_(ツ)_/¯
+
+b: They say you should "make peace" with your emotions, as if your emotions are some kind of *war criminals*.
+
+b: But I want us to make *more* than mere peace! I want us to be *allies!*
+
+b: I want to be a good guard-dog. Just like how hunger & thirst are alarms for your physical needs,
+
+b: I want to be the alarm for your emotional needs – your needs for safety, belonging, goodness.
+
+b: But... I suck at my job, so I need you to train me.
+
+b: Help me help you.
+
+b: Teaching an old dog new tricks *will* take a while. Maybe *years.*
+
+b: And sometimes I'll relapse, I'll slip into my old habits.
+
+b: I'll bark at shadows. I'll scare you with words. I might even show you some intrusive images of... things.
+
+b: I'm sorry! I'm a battered shelter dog! Battered dogs poop on your bed sometimes!
+
+b: But if you're patient with me... and just stay and sit with me...
+
+b: Maybe you can tame this wolf.
+
+`Game.clearText();`
+
+(...1000)
+
+`Game.OVERRIDE_CHOICE_SPEAKER = "h"`
+
+[Good dog.](#act4f-pat-bb) `Game.OVERRIDE_CHOICE_SPEAKER = "h"`
+
+`Game.OVERRIDE_CHOICE_SPEAKER = "b"`
+
+[Good human.](#act4f-pat-hong) `Game.OVERRIDE_CHOICE_SPEAKER = "b"`
+
+# act4f-pat-hong
+
+```
+Game.clearText();
+Game.FORCE_CANT_SKIP = true;
+music(null,{fade:0.5});
+sfx("youbothwin");
+```
+
+`publish("end-pat", ["pat-hong-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-hong-2"])`
+
+(...501)
+
+`publish("end-pat", ["pat-hong-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-hong-2"])`
+
+(...501)
+
+`publish("end-pat", ["pat-hong-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-hong-2"])`
+
+(...6501)
+
+`publish("end-pat", ["pat-hong-3"])`
+
+(...1001)
+
+(#act4f)
+
+# act4f-pat-bb
+
+```
+Game.clearText();
+Game.FORCE_CANT_SKIP = true;
+music(null,{fade:0.5});
+sfx("youbothwin");
+```
+
+`publish("end-pat", ["pat-bb-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-bb-2"])`
+
+(...501)
+
+`publish("end-pat", ["pat-bb-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-bb-2"])`
+
+(...501)
+
+`publish("end-pat", ["pat-bb-1"])`
+
+(...501)
+
+`publish("end-pat", ["pat-bb-2"])`
+
+(...6501)
+
+`publish("end-pat", ["pat-bb-3"])`
+
+(...1001)
+
+(#act4f)
+
+# act4f
+
+```
+Game.FORCE_CANT_SKIP = false;
+publish("end-pat", ["freak-out"])
+```
+
+{{if _.fifteencigs}}
+b: AAAAA YOU'RE STILL EATING ALONE FIFTEEN CIGARETTES AAAAA
+{{/if}}
+
+{{if _.parasite}}
+b: AAAAA YOU'RE STILL NOT PRODUCTIVE WHILE EATING WE'RE PARASITES AAAAA
+{{/if}}
+
+{{if _.whitebread}}
+b: AAAAA YOU'RE EATING MORE WHITE BREAD AAAAA
+{{/if}}
+
+```
+publish("act4", ["bb_closer", 18]);
+sfx("yaps", {volume:0.6});
+Game.FORCE_CANT_SKIP = true;
+```
+
+b: YAP YAP YAP YAP YAP
+
+`music('credits', {NO_LOOP:true, volume:0.45});`
+
+(...1884)
+
+(#credits)
diff --git a/scenes/credits.md b/scenes/credits.md
index 3bf7c79..846dfb0 100644
--- a/scenes/credits.md
+++ b/scenes/credits.md
@@ -1,9 +1,5 @@
# credits
-`music('credits', {NO_LOOP:true, volume:0.45});`
-
-(...1884)
-
`SceneSetup.credits()`
n: *CREDITS ROLL* (and mental health resource links)
\ No newline at end of file
diff --git a/scenes/hunter_rewrite.md b/scenes/hunter_rewrite.md
deleted file mode 100644
index 9ce9e11..0000000
--- a/scenes/hunter_rewrite.md
+++ /dev/null
@@ -1,181 +0,0 @@
-r: Looks like you're caught in a fight with yourself, kid.
-
-h2: (nods)
-
-r: You're not alone, friend. Anxiety's super common.
-
-{{if _.act1_ending=="fight"}}
-r: Heck, just yesterday, I heard someone on campus had a nervous breakdown and smashed their phone!
-{{/if}}
-
-{{if _.act1_ending=="flight"}}
-r: Heck, just yesterday, I heard someone curled up into an armadillo ball and cried in public!
-{{/if}}
-
-h2: huh imagine that.
-
-r: Listen: I know what it's like to have that animal in your head.
-
-r: All of us here do. That's why we're here! I throw these parties every weekend so we can forget our worries, forget that animal.
-
-h2: but my anxiety...
-
-r: Don't worry, kid. I used to be like you. But then I discovered a little trick to make that beast shut up forever...
-
-```
-Game.clearText();
-music(null, {fade:1});
-```
-
-(...2000)
-
-```
-publish("act2-party-action", ["twist3"]);
-sfx("rustle");
-```
-
-(...2500)
-
-`publish("act2-party-action", ["twist4"]);`
-
-(...1000)
-
-r: My own specialty blend. It's a mix of... well, everything.
-
-r: Bottoms up, motherfucker.
-
-
-# act2k
-
-r: You alright, kid?
-
-{{if _.a2_ending=="fight"}}
-(#act2k_fight)
-{{/if}}
-
-{{if _.a2_ending=="flight"}}
-(#act2k_flight)
-{{/if}}
-
-# act2k_fight
-
-r: Y-you...
-
-r: are *kinky*.
-
-r: I like that. Come to my party next weekend, cutie.
-
-h2: ok bye ciao adios
-
-r: The animal might have won today, but come back, and I'll mix something even stronger for you!
-
-h2: sayōnara au revoir auf wiedersehen zài jiàn
-
-r: You and me, kid, we'll show that beast who's boss!
-
-(#act2k_end)
-
-# act2k_flight
-
-h2: ok sorry i have to run
-
-r: Damn it. The animal won today, huh?
-
-h2: no no, just, uh, gotta run a marathon. gotta go fast.
-
-r: Come to my party next weekend, cutie. I'll mix something even stronger for you.
-
-`publish("act2-party-action", ["end_run"]);`
-
-h2: ok thanks gonna run run run run run
-
-r: You and me, kid, we'll show that beast who's boss!
-
-(#act2k_end)
-
-
-# act3
-
-`SceneSetup.act3();`
-
-h2: *Ah* that hits the spot.
-
-r: You know, kid...
-
-h2: Specifically, the spots hit are my left and right amygdala.
-
-r: You remind me of myself when I was younger. Back when I was tormented by the animal in my head.
-
-r: I'm proud to help you get rid of it. It's almost like a... *parental*... sort of pride.
-
-`Game.clearText();`
-
-r: Hey, quick question: truth or da--
-
-h2: DARE!
-
-r: Haha! Good.
-
-r: Ok. You see that swimming pool down there?
-
-h2: Yeah? Ten floors down?
-
-r: Jump in.
-
-h2: ...
-
-h2: Wait, what?
-
-r: The animal's started whining, hasn't it?
-
-r: *Oh nooooo it's dangerous, don't do iiiiit.*
-
-r: But that's exactly why we need to do thrilling, death-defying stunts! Party hard! Carpe diem! Snort coke off a hooker's butt, hashtag #YOLO!
-
-r: Show that animal we don't give two *dicks* about its bitching! Jump.
-
-h2: Uh, but sometimes, um... fear has a point...
-
-r: ...
-
-r: ...
-
-r: I'm sorry, did you fall for that "mindfulness" fad bullshit that claims feeling bad is *good?*
-
-r: Pleasure is the opposite of pain. There-fucking-fore, you can use pleasure to fight pain! How goddamn stupid are those California-Buddhists to not see that?!
-
-r: Kid, I know that *you* know that animal *hurts* people like us. It *tortures* people like us.
-
-r: It's not your fucking friend. It's a savage beast that needs to be tranquilized,
-
-r: Or taken to the shed to be *shot in the back of the skull.*
-
-r: Otherwise, you're going to let it win.
-
-h2: ...you're wrong.
-
-h2: I'm not going to let it win.
-
-r: Fuck yeah! I believe in you, babe! Kill it! <3
-
-(#act3a)
-
-
-# act3_walkaway
-
-r: Aw *come on*. After everything it put you through, you're just walking away?!
-
-r: What's the matter, kid? You *scared?*
-
-h2: Yes.
-
-h2: I'm scared.
-
-h2: And that's okay!
-
-h2: It's okay to be scared.
-
-r: Did they just lock the door?
-
-
-(#act4)
\ No newline at end of file
diff --git a/scripts/act4/Act4_BG.js b/scripts/act4/Act4_BG.js
index a5bb717..b81ff6a 100644
--- a/scripts/act4/Act4_BG.js
+++ b/scripts/act4/Act4_BG.js
@@ -1,13 +1,17 @@
Loader.addImages([
-
- { id:"placeholder_act4_bg", src:"sprites/act4/placeholder_act4_bg.png" },
+
{ id:"act4_callback", src:"sprites/act4/callback.png" },
- { id:"al_shire", src:"sprites/act4/al_shire.png" },
- { id:"outside_hong", src:"sprites/act4/hong_outside.png" },
+ { id:"a4_hong_walks_in", src:"sprites/act4/hong_walks_in.png" },
+ { id:"a4_hong_transition", src:"sprites/act4/hong_transition.png" },
- { id:"a4_talk_1", src:"sprites/act4/talk_1.png" },
- { id:"a4_talk_2", src:"sprites/act4/talk_2.png" },
- { id:"a4_talk_smash", src:"sprites/act4/talk_smash.png" },
+ { id:"break_hp", src:"sprites/act4/break_hp.png" },
+
+ { id:"al_shire", src:"sprites/act4/al_shire.png" },
+ { id:"hong_to_alshire", src:"sprites/act4/hong_to_alshire.png" },
+ { id:"bb_to_alshire", src:"sprites/act4/bb_to_alshire.png" },
+
+ { id:"hong_closer", src:"sprites/act4/hong_closer.png" },
+ { id:"bb_closer", src:"sprites/act4/bb_closer.png" }
]);
@@ -20,157 +24,385 @@ function BG_Act4(){
var self = this;
- // Sprites!
- self.bgSprite = new Sprite({
- image: Library.images.placeholder_act4_bg,
- grid:{ width:1, height:1 },
- frame:{ width:720, height:1200 },
+ // BACKGROUND SPRITES
+ var BGSpriteConfig = {
+ image: Library.images.intro_bg,
+ grid:{ width:2, height:3 },
+ frame:{ width:1200, height:1200 },
+ anchor:{ x:0, y:0 },
+ frameNames:[ "sky", "clouds", "buildings", "grass", "stump" ],
+ x:0, y:0
+ };
+ self.sky = new Sprite(BGSpriteConfig);
+ self.sky.gotoFrameByName("sky");
+ self.clouds = new Sprite(BGSpriteConfig);
+ self.clouds.gotoFrameByName("clouds");
+ self.buildings = new Sprite(BGSpriteConfig);
+ self.buildings.gotoFrameByName("buildings");
+ self.grass = new Sprite(BGSpriteConfig);
+ self.grass.gotoFrameByName("grass");
+ self.stump = new Sprite(BGSpriteConfig);
+ self.stump.gotoFrameByName("stump");
+
+ /////////////////////////////////////////////
+ // EXTERNAL WORLD SPRITES ///////////////////
+ /////////////////////////////////////////////
+
+ // Hong in
+ self.hong_walks_in = new Sprite({
+ image: Library.images.a4_hong_walks_in,
+ grid:{ width:8, height:3 },
+ frame:{ width:720, height:500 },
+ anchor:{ x:0, y:0 },
+ x:0, y:200
});
- self.callbackSprite = new Sprite({
+ self.hong_walks_in.gotoFrame(19); // blank
+
+ // Callback
+ self.callback = new Sprite({
image: Library.images.act4_callback,
grid:{ width:2, height:1 },
frame:{ width:400, height:200 },
- y: 347,
- frameNames:[
- "phone",
- "puddle"
- ]
+ y: 347
});
- self.callbackSprite.gotoFrameByName( _.act1_ending=="fight" ? "phone" : "puddle" );
+ self.callback.gotoFrame( _.act1_ending=="fight" ? 0 : 1 );
- self.alShireSprite = new Sprite({
+ var hongSitsSprite = {
+ image: Library.images.a4_hong_transition,
+ grid:{ width:8, height:3 },
+ frame:{ width:720, height:500 },
+ anchor:{ x:0, y:0 },
+ x:0, y:200
+ };
+
+ // The crutches
+ self.crutches = new Sprite(hongSitsSprite);
+ self.crutches.gotoFrame(2);
+ self.crutches.visible = false;
+
+ // The legs
+ self.legs = new Sprite(hongSitsSprite);
+ self.legs.gotoFrame( _.INJURED ? 1 : 0);
+ self.legs.visible = false;
+
+ // Hong transition
+ self.hong_transition = new Sprite(hongSitsSprite);
+ self.hong_transition.gotoFrame(3);
+ self.hong_transition.visible = false;
+
+ // Hong transition Cone
+ self.hong_transition_cone = new Sprite(hongSitsSprite);
+ self.hong_transition_cone.gotoFrame(6);
+ self.hong_transition_cone.visible = false;
+
+ // Alshire
+ self.alshire = new Sprite({
image: Library.images.al_shire,
- grid:{ width:4, height:1 },
+ grid:{ width:8, height:3 },
frame:{ width:360, height:360 },
- y: 192,
- frameNames:[
- "ask",
- "panic",
- "run",
- "blank"
- ]
+ y: 190
});
- self.alShireSprite.gotoFrameByName("blank"); // blank
- self.outsideHongSprite = new Sprite({
- image: Library.images.outside_hong,
- grid:{ width:4, height:3 },
- frame:{ width:720, height:720 },
- y: 90,
- frameNames:[
- "blank",
+ self.alshire.visible = false;
- "walk",
- "walk-injured",
- "eat",
- "eat-injured",
- "talk",
- "talk-injured",
- "look-back",
- "look-back-injured",
- ]
+ // Hong alshire
+ self.hong_to_alshire = new Sprite({
+ image: Library.images.hong_to_alshire,
+ grid:{ width:8, height:2 },
+ frame:{ width:300, height:300 },
+ /*x:210,*/ y:258
});
+ self.hong_to_alshire.visible = false;
+
+ // BB alshire
+ var bb_to_alshire_sprite = {
+ image: Library.images.bb_to_alshire,
+ grid:{ width:4, height:1 },
+ frame:{ width:200, height:300 },
+ /*x:261,*/ y:281
+ };
+ self.bb_to_alshire = new Sprite(bb_to_alshire_sprite);
+ self.bb_to_alshire.visible = false;
+
+ /////////////////////////////////////////////
+ // INTERNAL WORLD SPRITES ///////////////////
+ /////////////////////////////////////////////
// Anxiety BG... WHITE MODE
self.anxiety = new BG_Anxiety(true);
- // Talking Sprites
- self.smashSprite = new Sprite({
- image: Library.images.a4_talk_smash,
- grid:{ width:3, height:1 },
- frame:{ width:720, height:600 },
+ // Hong
+ self.hong = new Act4_Hong();
+
+ // BB
+ self.beebee = new Act4_Beebee();
+
+ // Smash Sprite
+ var break_hp_sprite = {
+ image: Library.images.break_hp,
+ grid:{ width:8, height:2 },
+ frame:{ width:720, height:1000 },
+ };
+ self.break_hp = new Sprite(break_hp_sprite);
+ self.break_hp.y = -70;
+ self.break_hp.visible = false;
+ self.break_hp_cone = new Sprite(break_hp_sprite);
+ self.break_hp_cone.visible = false;
+
+ // Hong Closer
+ self.hong_closer = new Sprite({
+ image: Library.images.hong_closer,
+ grid:{ width:8, height:1 },
+ frame:{ width:300, height:300 },
+ y: 270
+ });
+ self.hong_closer.visible = false;
+
+ // BB Closer
+ var bb_closer_sprite = {
+ image: Library.images.bb_closer,
+ grid:{ width:8, height:4 },
+ frame:{ width:500, height:500 },
y: 200
- });
- self.smashSprite.gotoFrame(2); // blank
- self.talk1Sprite = new Sprite({
- image: Library.images.a4_talk_1,
- grid:{ width:3, height:1 },
- frame:{ width:720, height:400 },
- y: 256
- });
- self.talk2Sprite = new Sprite({
- image: Library.images.a4_talk_2,
- grid:{ width:4, height:2 },
- frame:{ width:720, height:400 },
- y: 256,
- frameNames:[
-
- "talk",
-
- "pat-bb-1",
- "pat-bb-2",
- "pat-bb-3",
-
- "pat-hong-1",
- "pat-hong-2",
- "pat-hong-3",
-
- "freak-out"
-
- ]
- });
+ };
+ self.bb_closer = new Sprite(bb_closer_sprite);
+ self.bb_closer.visible = false;
+ self.bb_closer_cone = new Sprite(bb_closer_sprite);
+ self.bb_closer_cone.visible = false;
+ self.bb_closer_cone.gotoFrame(28);
+ self.bb_closer_coneb = new Sprite(bb_closer_sprite);
+ self.bb_closer_coneb.visible = false;
+ self.bb_closer_coneb.gotoFrame(29);
// LAYERS
self.layers = [
- self.bgSprite,
- self.callbackSprite,
- self.alShireSprite,
- self.outsideHongSprite,
+ self.sky,
+ self.clouds,
+ self.buildings,
+ self.grass,
+ self.alshire,
+
+ self.hong_walks_in,
+ self.callback,
+
+ self.stump,
+
+ self.crutches,
self.anxiety,
+ self.legs,
+ self.hong_transition,
+ self.hong_transition_cone,
- self.smashSprite,
- self.talk1Sprite,
- self.talk2Sprite
+ self.break_hp,
+ self.break_hp_cone,
+
+ self.hong,
+ self.beebee,
+
+ self.hong_to_alshire,
+ self.bb_to_alshire,
+
+ self.hong_closer,
+ self.bb_closer_coneb,
+ self.bb_closer,
+ self.bb_closer_cone,
];
var PARALLAXES = [
- 0.5, // placeholder bg
- 0.8, // callback
- 0.6, // Al Shire
- 1.0, // outside Hong
+ 0, // sky
+ 0.1, // clouds
+ 0.25, // buildings
+ 0.48, // grass
- 0.0, // anxiety bg
+ 0.8, // alshire
- 1.0, // smash sprite
- 1.0, // talk 1 sprite
- 1.0, // talk 2 sprite
+ 1.0, // hong_walks_in
+ 1.0, // callback
+
+ 1.0, // stump
+
+ 1.0, // crutches
+ 0.0, // anxiety
+ 1.0, // legs
+ 1.0, // hong_transition
+ 1.0, // hong_transition_cone
+
+ 0, // break_hp
+ 0, // break_hp_cone
+
+ 1.0, // hong
+ 1.0, // beebee
+
+ 1.0, // hong_to_alshire
+ 1.0, // bb_to_alshire
+
+ 1.0, // hong_closer,
+ 1.0, // bb_closer_coneb
+ 1.0, // bb_closer,
+ 1.0, // bb_closer_cone,
];
var ALPHAS = [
- 1.0, // placeholder bg
- 1.0, // callback
- 1.0, // callback
- 1.0, // outside Hong
+ 1.0, // sky
+ 1.0, // clouds
+ 1.0, // buildings
+ 1.0, // grass
- 0.0, // anxiety bg
+ 1.0, // alshire
- 1.0, // smash sprite
- 0.0, // talk 1 sprite
- 0.0, // talk 2 sprite
+ 1.0, // hong_walks_in
+ 1.0, // callback
+
+ 1.0, // stump
+
+ 1.0, // crutches
+ 0.0, // anxiety
+ 1.0, // legs
+ 1.0, // hong_transition
+ 1.0, // hong_transition_cone
+
+ 1.0, // break_hp
+ 1.0, // break_hp_cone
+
+ 0.0, // hong
+ 0.0, // beebee
+
+ 1.0, // hong_to_alshire
+ 1.0, // bb_to_alshire
+
+ 1.0, // hong_closer,
+ 1.0, // bb_closer_coneb
+ 1.0, // bb_closer,
+ 1.0, // bb_closer_cone,
];
+ var MAGIC_NUMBER_2 = 163;
var OFFSETS = [
- 0,
- 0,
- 0,
- 0,
- 0,
+ 0, // sky
+ 0, // clouds
+ 0, // buildings
+ 0, // grass
+
+ 0, // alshire
+
+ 0, // hong_walks_in
+ 0, // callback
+
+ 0, // stump
+
+ 207, // crutches
+ 0, // anxiety
+ 207, // legs
+ 207, // hong_transition
+ 207, // hong_transition_cone
+
+ 0, // break_hp
+ 0, // break_hp_cone
+
+ 0, // hong
+ 0, // beebee
+
+ 210, // hong_to_alshire
+ 261+100, // bb_to_alshire
+
+ 50 + MAGIC_NUMBER_2, // hong_closer,
+ 96 + MAGIC_NUMBER_2, // bb_closer_coneb
+ 96 + MAGIC_NUMBER_2, // bb_closer,
+ 96 + MAGIC_NUMBER_2, // bb_closer_cone,
+
+ ];
+
+ ////////////////////////////////////////////////////////////////////////
+ // ANIMATIONS... ///////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////
+
+ // animation: { ticker:0, target:"sprite_name", frames:[{when:0, wait:0.1, then:4}, ...] }
+ self.animations = [];
+ self.createAnimation = function(spriteName, frames){
+ self.animations.push({
+ ticker: 0,
+ target: spriteName,
+ frames: frames
+ });
+ };
+ var _animSequence = function(from, to, duration, loop){
+ var frames = [];
+ for(var frame=from; frame<=to; frame++){
+
+ if(loop){
+ // LOOP
+ var next = (frame==to) ? from : frame+1;
+ frames.push({ when:frame, wait:duration, then:next });
+ }else{
+ // NOT LOOP: FINAL FRAME IS "TO"
+ var next = frame+1;
+ if(next<=to){
+ frames.push({ when:frame, wait:duration, then:next });
+ }
+ }
+
+ }
+ return frames;
+ };
+ self.executeAnimation = function(anim){
+
+ // Frame...
+ var sprite = self[anim.target];
+ var frame = anim.frames.find(function(frame){
+ return frame.when == sprite.currentFrame;
+ });
+ if(frame){
+
+ var frameToGoTo = frame.when;
+
+ // Next?
+ anim.ticker += 1/60;
+ if(anim.ticker >= frame.wait){
+ anim.ticker = 0;
+ frameToGoTo = frame.then;
+ }
+
+ // Change sprite
+ sprite.gotoFrame(frameToGoTo);
+
+ }
+
+ };
+
+ // SMASH THAT
+ self.createAnimation("break_hp", _animSequence( 1,4, 1/12, true) );
+
+ // ALSHIRE
+ self.createAnimation("alshire", _animSequence( 6,9, 1/12, true) );
+ self.createAnimation("alshire", _animSequence( 11,22, 1/30, false) );
+
+ // BB
+ self.createAnimation("bb_closer", _animSequence( 18,21, 1/24, true) );
+
+ ////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////
- -210,
- -210,
- -210
- ]
var parallax = 0;
var parallaxTicker = 0;
var PARALLAXING = null;
- var ALPHA_INDEX = 4;
+ var ANXIETY_INDEX = 9;
+ var ticker = 0;
+ var MAGIC_NUMBER = (210 + 8);
+
self.update = function(){
+ // TICKER
+ ticker += 1/60;
+
+ // CLOUD OFFSET
+ OFFSETS[1] = 80 - ticker*3;
+
// START PARALLAXING IN / OUT
if(PARALLAXING!=null){
@@ -186,21 +418,23 @@ function BG_Act4(){
// 0 to -180 in one second, smoothed
var t = Math.cos(parallaxTicker*Math.TAU/2); // 1 to -1
t = (1-t)/2; // 0 to 1
- parallax = -t*210;
+ parallax = -t*MAGIC_NUMBER;
// Anxiety Alpha
- ALPHAS[ALPHA_INDEX] = t;
+ ALPHAS[ANXIETY_INDEX] = t;
// DONE
if(t==1 || t==0){
PARALLAXING = null;
- if(STAGE==1){
- ALPHAS[6] = 1; // Talk 1
- }
-
- if(STAGE==3){
- ALPHAS[7] = 1; // Talk 2
+ // Seeing Al-Shire
+ if(STAGE==2){
+ self.break_hp.visible = false;
+ self.bb_to_alshire.visible = true;
+ if(_.INJURED){
+ self.bb_to_alshire.gotoFrame(2); // CONE!
+ }
+ ALPHAS[16] = 0; // BB
}
}
@@ -208,27 +442,69 @@ function BG_Act4(){
}
// Anxiety BG
- if(ALPHAS[ALPHA_INDEX]>0){
- self.anxiety.update(ALPHAS[ALPHA_INDEX]);
- if(ALPHAS[ALPHA_INDEX]==1){ // if fully visible...
- ALPHAS[0] = ALPHAS[1] = ALPHAS[2] = ALPHAS[3] = 0; // hide everything under
- }else{
- ALPHAS[0] = ALPHAS[1] = ALPHAS[2] = ALPHAS[3] = 1; // hide everything under
- }
+ if(ALPHAS[ANXIETY_INDEX]>0){
+ self.anxiety.update(ALPHAS[ANXIETY_INDEX]);
}
+ // BREAK_HP'S ALPHA
+ if(self.break_hp.visible){
+ self.break_hp.alpha = ALPHAS[ANXIETY_INDEX];
+ }
+
+ // ALL ANIMS
+ self.animations.forEach(self.executeAnimation);
+
};
self.draw = function(ctx){
+ // SUPER HACK FOR CONES
+
+ // INTRO
+ if(_.INJURED && self.hong_transition.visible && self.hong_transition.currentFrame>=16){
+ self.hong_transition_cone.visible = true;
+ self.hong_transition_cone.gotoFrame(self.hong_transition.currentFrame+5);
+ }else{
+ self.hong_transition_cone.visible = false;
+ }
+
+ // SMASHING
+ if(self.break_hp.visible){
+ self.break_hp.y = self.break_hp.y*0.8 + 0*0.2; // move in
+ }
+ if(_.INJURED && self.break_hp_cone.visible){
+ self.break_hp_cone.gotoFrame( self.break_hp.currentFrame+5 );
+ }
+ self.break_hp_cone.y = self.break_hp.y;
+
+ // ENDINGS YAP YAP YAP
+ if(self.bb_closer.currentFrame>=18 && self.bb_closer.currentFrame<=21){
+ self.bb_closer_coneb.gotoFrame(31); // blank
+ self.bb_closer_cone.gotoFrame(self.bb_closer.currentFrame + 4); // CONE
+ }
+
+ // BB EASES IN
+ if(self.bb_to_alshire.visible){
+ OFFSETS[18] = OFFSETS[18]*0.9 + 261*0.1;
+ }
+
+
+ /////////////////////////////////////////
+
ctx.save();
for(var i=0; i0){
- ctx.globalAlpha = ALPHAS[i];
- layer.draw(ctx);
+ if( !(i