<script>
//console.log("running Title script");
Mgr.initFade(3, "maintitle");
</script>\
{
<div class="fade-3">
<div class="titlecard">
Fragments from the Biophilia Codex
</div>
</div>
(event: when $gotoscn is 1)[(set: $gotoscn to -1)(set: $current to 1)(goto: "Title Card")]
}<script>
console.log("running TOC script");
Mgr.initFade(3, "toc");
Mgr.initToc();
</script>\
<div class="fade-3">\
<div class="width-800">\
<span style="font-size:1.4em;">Fragments from the Biophilia Codex</span>
<div class="toc">\
(for: each _index, ...(range: 1,$read))[\
(link: $titles's (_index))[(set: $current to _index)(goto: "Title Card")]
]\
</div>\
-
[[Acknowledgements]]
</div>
</div><script>
if ( !window.A ) {
window.A = {};
}
A.foley = {};
var howl_path = 'biophilia/';
A.foley.marginalia = new Howl({
src: [howl_path+'marginalia.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.intheirnames = new Howl({
src: [howl_path+'intheirnames.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.unidentifiedcongregant = new Howl({
src: [howl_path+'unidentifiedcongregant.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.fatherofmicrobiology = new Howl({
src: [howl_path+'fatherofmicrobiology.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.newfuturetoglaucous = new Howl({
src: [howl_path+'newfuturetoglaucous.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.bookofcommonprayer = new Howl({
src: [howl_path+'bookofcommonprayer.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.newfuturetoglaucous1 = new Howl({
src: [howl_path+'newfuturetoglaucous1.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.onglaucous = new Howl({
src: [howl_path+'onglaucous.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.glaucoustonewfuture = new Howl({
src: [howl_path+'glaucoustonewfuture.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.objectsofprayer = new Howl({
src: [howl_path+'objectsofprayer.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
A.foley.lettercave = new Howl({
src: [howl_path+'lettercave.mp3'],
html5: true,
loop: false,
volume: 0.75,
});
var allSnd = 0;
var loaded = false;
var total_snd = Object.keys( A.foley ).length - 1;
for ( var snd in A.foley ) {
A.foley[snd].once( 'load', function() {
allSnd++;
if ( allSnd === total_snd ) {
Mgr.audio_loaded = true;
} else {
Mgr.load_percent = ((allSnd / total_snd) * 100).toFixed(1);
}
});
}
harlowe.State.variables.audio = [
A.foley.marginalia,
A.foley.intheirnames,
A.foley.unidentifiedcongregant,
A.foley.fatherofmicrobiology,
A.foley.newfuturetoglaucous,
A.foley.bookofcommonprayer,
A.foley.newfuturetoglaucous1,
A.foley.onglaucous,
A.foley.glaucoustonewfuture,
A.foley.objectsofprayer,
A.foley.lettercave
];
if ( !window.Mgr ) {
window.Mgr = {};
}
Mgr.audio_loaded = false;
Mgr.load_percent = 0;
Mgr.current_timeout = false;
Mgr.current_total_time = 0;
Mgr.debug = false;
Mgr.finished = false;
Mgr.advance_entry = false;
Mgr.resizePages = function() {
Mgr.current_page = 0;
Mgr.current_pages = -1;
Mgr.current_pages = [];
var current_page_index = 0;
var curHeight = 0;
for ( var i = 0; i < Mgr.current_height.length; i++ ) {
if ( curHeight + Mgr.current_height[i] < Mgr.window_height - 108 ) {
curHeight += Mgr.current_height[i];
if ( i == Mgr.current_height.length - 1 ) {
Mgr.current_pages[current_page_index] = Mgr.current_height.length - 1;
break;
}
} else {
Mgr.current_pages[current_page_index] = i;
curHeight = 0;
current_page_index++;
}
}
//console.log( Mgr.current_pages );
}
Mgr.lineByLineScroll = function() {
var scrollThreshold = Mgr.current_totalHeight[harlowe.State.variables.script + 2];
if ( harlowe.State.variables.script + 4 >= Mgr.current_totalHeight.length ) {
scrollThreshold = Mgr.current_totalHeight[Mgr.current_totalHeight.length - 1];
}
//console.log( "scrollThreshold: " + scrollThreshold );
//console.log( "window height: " + $( window ).height() );
if ( scrollThreshold !== undefined && scrollThreshold >= $( window ).height() ) {
var minScroll = 0;
var prevScrollIndex = Mgr.scroll_index;
for ( var i = Mgr.scroll_index; i < Mgr.current_height.length; i++ ) {
//console.log( "minScroll: " + minScroll );
if ( minScroll >= Mgr.current_height[harlowe.State.variables.script + 2] ) {
Mgr.scroll_index = i;
break;
}
minScroll += Mgr.current_height[i];
}
if ( Mgr.scroll_index != prevScrollIndex || Mgr.scroll_index == Mgr.current_totalHeight[Mgr.current_totalHeight.length] ) {
let scroll = Mgr.current_totalHeight[Mgr.scroll_index]
if ( scroll + Mgr.window_height > $( document ).height() ) {
scroll = $(document).height() - Mgr.window_height;
}
$('html').animate({
//scrollTop: $(document).scrollTop() + el.height()
scrollTop: Mgr.current_totalHeight[Mgr.scroll_index]
}, 1500 );
//console.log( Mgr.current_totalHeight[Mgr.scroll_index] );
}
}
}
Mgr.pageScroll = function() {
if ( $( window ).height() != Mgr.window_height ) {
Mgr.window_height = $( window ).height();
Mgr.resizePages();
}
if ( harlowe.State.variables.script >= Mgr.current_pages[Mgr.current_page] ) {
//console.log( `scrolling to page ${Mgr.current_page + 1}, script index ${Mgr.current_pages[Mgr.current_page] + 1}` );
let scroll = Mgr.current_totalHeight[Mgr.current_pages[Mgr.current_page]]
if ( scroll + Mgr.window_height > $( document ).height() ) {
scroll = $(document).height() - Mgr.window_height;
}
$('html').animate( {
scrollTop: scroll
}, 1500 );
Mgr.scroll_index = Mgr.current_pages[Mgr.current_page];
Mgr.current_page++;
} else {
let scroll = Mgr.current_page - 1 < 0 ? 0 : Mgr.current_totalHeight[Mgr.current_pages[Mgr.current_page - 1]]
if ( scroll + Mgr.window_height > $( document ).height() ) {
scroll = $(document).height() - Mgr.window_height;
}
if ( $( document ).scrollTop() != scroll ) {
$('html').animate( {
scrollTop: scroll
}, 1500 );
}
}
}
Mgr.playScene = function() {
var scene = harlowe.State.variables.audio[harlowe.State.variables.current - 1];
var scn_track = scene.play();
var hooks = $( "#poem" ).find( ".line" );
//hooks.css( "display", "block" );
//console.log( hooks );
Mgr.advance_entry = false;
Mgr.current_totalHeight = -1;
Mgr.current_height = -1;
Mgr.scroll_index = 0;
Mgr.current_totalHeight = [];
Mgr.current_height = [];
Mgr.window_height = $( window ).height();
hooks.each( ( i, el ) => {
//console.log( i + " totalHeight " + $( el ).offset().top );
Mgr.current_totalHeight[i] = $( el ).offset().top;
if ( i > 0 ) {
Mgr.current_height[i] = $( el ).offset().top - Mgr.current_totalHeight[i - 1];
} else {
Mgr.current_height[i] = $( el ).offset().top;
}
});
//hooks.css( "display", "" );
$( "#poem" ).css( "height", Mgr.current_totalHeight[Mgr.current_totalHeight.length - 1] );
$( ".line" ).css( 'opacity', '0' );
Mgr.resizePages();
//console.log( $( "#poem > .line" ) );
//console.log( Mgr.current_height );
//console.log( Mgr.current_totalHeight );
scene.once( 'play', function() {
Mgr.nextLine();
},
scn_track
);
};
Mgr.nextLine = function( to ) {
var timeout;
if ( to == null || to == undefined ) {
timeout = harlowe.State.variables.timer[harlowe.State.variables.script];
} else {
timeout = harlowe.State.variables.timer[harlowe.State.variables.script] - to;
//console.log( "timeout - offset:" + timeout );
}
$( `#${harlowe.State.variables.script.toString()}.line` ).css( 'opacity', '1' );
//console.log( "script currently set to " + harlowe.State.variables.script);
Mgr.pageScroll();
Mgr.current_timeout = setTimeout( function() {
clearTimeout( Mgr.current_timeout );
Mgr.current_timeout = false;
var snd = harlowe.State.variables.audio[harlowe.State.variables.current - 1];
var curTime = Mgr.current_total_time + harlowe.State.variables.timer[harlowe.State.variables.script];
var curSeek = snd.seek( snd ) * 1000;
var offset = curSeek - curTime;
var nextLineOffset = 0;
//console.log( "offset" + offset );
if ( !snd.playing( snd ) ) {
nextLineOffset = 0;
console.log("sound not playing, no offset");
} else if ( Math.abs( offset ) > 500 ) {
//console.log( "offset too large, recalibrating" )
var scrub = 0;
for ( var i = 0; i < harlowe.State.variables.timer.length; i++ ) {
var t = harlowe.State.variables.timer[i];
if ( scrub + t < curSeek ) {
scrub += t;
//console.log( "haven't caught up, scrubbing to " + scrub + "ms" );
} else {
for ( var j = 0; j < i; j++ ) {
Mgr.updateScript( j, true );
//console.log( "catching up script to: " + j );
}
Mgr.updateScript( i, false, offset );
break;
}
}
return;
} else if ( offset < -10 ) {
Mgr.current_timeout = setTimeout( function() {
clearTimeout( Mgr.current_timeout );
Mgr.current_timeout = false;
Mgr.updateScript( harlowe.State.variables.script, false );
}, -offset );
return;
} else if ( offset > 10 ) {
nextLineOffset = offset;
}
Mgr.updateScript( harlowe.State.variables.script, false, nextLineOffset );
}, timeout
);
};
Mgr.updateScript = function( index, bypass, offset ) {
//console.log( $( "#" + index.toString() + ".transient" ) );
$( "#" + index.toString() + ".transient" ).css( 'opacity', '0' );
$( "#" + index.toString() + ".transient-long" ).css( 'opacity', '0' );
if ( index > harlowe.State.variables.script || !bypass ) {
Mgr.current_total_time += harlowe.State.variables.timer[harlowe.State.variables.script];
harlowe.State.variables.script++;
//console.log("script index now " + harlowe.State.variables.script );
}
if ( !bypass ) {
if ( harlowe.State.variables.script < harlowe.State.variables.timer.length ) {
Mgr.nextLine( offset );
} else {
if ( harlowe.State.variables.timer.length > 1 ) {
$( 'tw-link' ).css( 'visibility', 'visible' );
$( 'tw-link' ).css( 'opacity', '1' );
var to = setTimeout( function() {
clearTimeout( to );
$( 'tw-link' ).css( 'color', '#00cc99');
var tto = setTimeout( function() {
clearTimeout( tto );
$( 'tw-link' ).css( 'transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( '-webkit-transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( 'pointer-events', 'auto' );
}, 1500 );
}, 2000 );
}
}
}
}
/*Mgr.goBack = function() {
clearTimeout( Mgr.current_timeout );
Mgr.current_timeout = false;
var snd = harlowe.State.variables.audio[harlowe.State.variables.current - 1];
if ( snd.playing() ) {
snd.stop();
}
harlowe.State.variables.read++;
harlowe.State.variables.current = -1;
harlowe.State.variables.state = -1;
harlowe.State.variables.timer = 0;
harlowe.State.variables.script = 0;
Mgr.current_total_time = 0;
//console.log( harlowe.State.variables.read );
//console.log( harlowe.State.variables.current);
//console.log( harlowe.State.variables.state );
//console.log( harlowe.State.variables.timer );
};*/
Mgr.goNext = function() {
if ( Mgr.advance_entry ||
$( 'tw-link' ).css( 'pointer-events' ) == 'none' ||
$( 'tw-enchantment' ).css( 'pointer-events' ) == 'none' ) {
//console.log("no pointer events, exiting function");
return
}
//console.log("click valid, going to next entry!");
Mgr.advance_entry = true;
//$( 'tw-link' ).css( 'pointer-events', 'none' );
Mgr.fadeToBlack();
clearTimeout( Mgr.current_timeout );
Mgr.current_timeout = false;
var snd = harlowe.State.variables.audio[harlowe.State.variables.current - 1];
if ( snd != null && snd != undefined && snd.playing() ) {
snd.stop();
}
if ( Mgr.finished !== true ) {
harlowe.State.variables.read++;
harlowe.State.variables.current += 1;
} else {
harlowe.State.variables.current += 1;
}
harlowe.State.variables.state = -1;
harlowe.State.variables.timer = 0;
harlowe.State.variables.script = 0;
Mgr.current_total_time = 0;
//console.log("executed all code in goNext");
//console.log( harlowe.State.variables.read );
//console.log( harlowe.State.variables.current);
//console.log( harlowe.State.variables.state );
//console.log( harlowe.State.variables.timer );
//console.log( "current timeout: " + Mgr.current_timeout );
//console.log( Mgr );
};
/*Mgr.initBackButton = function() {
$( '.go-back' ).css( 'opacity', '0' );
$( 'tw-link' ).css( 'color', 'white');
$( 'tw-link' ).css( 'transition', 'color 1.5s linear');
$( 'tw-link' ).css( '-webkit-transition', 'color 1.5s linear');
$( 'tw-link' ).css( 'pointer-events', 'none' );
$( '.go-back' ).on( 'transitionend webkitTransitionEnd', function() {
$( 'tw-link' ).css( 'color', '#00cc99');
});
$( 'tw-link' ).on( 'transitionend webkitTransitionEnd', function() {
$( 'tw-link' ).css( 'transition', 'color 0.1s ease-in-out');
$( 'tw-link' ).css( '-webkit-transition', 'color 0.1s ease-in-out');
$( 'tw-link' ).css( 'pointer-events', 'auto' );
});
};*/
Mgr.initNextButton = function() {
$( 'tw-link' ).css( 'opacity', '0' );
$( 'tw-link' ).css( 'visibility', 'hidden' );
$( 'tw-link' ).css( 'color', 'white');
$( 'tw-link' ).css( 'transition', 'opacity 2.0s ease-in-out, color 1.5s linear');
$( 'tw-link' ).css( '-webkit-transition', 'opacity 2.0s ease-in-out, color 1.5s linear');
$( 'tw-link' ).css( 'pointer-events', 'none' );
if ( Mgr.debug == true || Mgr.finished == true ) {
var to = setTimeout( function() {
$( 'tw-link' ).css( 'visibility', 'visible' );
$( 'tw-link' ).css( 'opacity', '1' );
var tto = setTimeout( function() {
$( 'tw-link' ).css( 'color', '#00cc99');
var ttto = setTimeout( function() {
$( 'tw-link' ).css( 'transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( '-webkit-transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( 'pointer-events', 'auto' );
clearTimeout( ttto );
}, 1500 );
clearTimeout( tto );
}, 1500 );
clearTimeout( to );
}, 2000);
}
};
Mgr.initToc = function() {
$( 'tw-link' ).css( 'color', 'white');
$( 'tw-link' ).css( 'transition', 'opacity 2.0s ease-in-out, color 1.5s linear');
$( 'tw-link' ).css( '-webkit-transition', 'opacity 2.0s ease-in-out, color 1.5s linear');
$( 'tw-link' ).css( 'pointer-events', 'none' );
$( 'tw-link' ).on( 'transitionend webkitTransitionEnd', function() {
$( 'tw-link' ).css( 'transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( '-webkit-transition', 'opacity 2.0s ease-in-out, color 0.1s ease-in-out');
$( 'tw-link' ).css( 'pointer-events', 'auto' );
});
};
Mgr.loadGame = function() {
$( '.loader' ).css( 'text-align', 'center' );
$( '.fader' ).css( 'opacity', '0' );
$( '.fader' ).css( 'pointer-events', 'none' );
var load = setInterval ( function() {
if ( Mgr.audio_loaded ) {
var to = setTimeout( function() {
$( '.fader' ).css( 'opacity', '1' );
clearTimeout( to );
}, 1500);
$( '.fader' ).on( 'transitionend webkitTransitionEnd', function() {
$( '.fader' ).css( 'pointer-events', 'auto' );
});
$( '.loader' ).css( 'display', 'none' );
clearInterval( load );
} else {
$(".loader").html( 'Loading...' + Mgr.load_percent.toString() + '%' );
}
}, 5);
};
Mgr.initFade = function( s, type ) {
var str = ".fade-" + s.toString();
$( str ).css( 'opacity', '0' );
$( '.subtitle' ).css( 'opacity', '0' );
$( 'tw-link' ).css( 'pointer-events', 'none' );
$( 'tw-enchantment' ).css( 'pointer-events', 'none' );
var to = setTimeout( function() {
$( str ).css( 'opacity', '1' );
clearTimeout( to );
}, 1);
$( str ).on( 'transitionend webkitTransitionEnd', function() {
if ( $( str ).css( 'opacity' ) == 0 ) {
return;
}
switch ( type ) {
case "poem" :
$( 'tw-link' ).css( 'opacity', '1' );
$( 'tw-enchantment' ).css( 'pointer-events', 'auto' );
$( 'tw-link' ).css( 'pointer-events', 'auto' );
break;
case "title" :
case "maintitle" :
$( 'tw-enchantment' ).css( 'pointer-events', 'auto' );
$( 'tw-link' ).css( 'pointer-events', 'auto' );
if ( ( type ) == "maintitle" ) {
var tto = setTimeout( function() {
Mgr.fadeOutTitle( s );
clearTimeout( tto );
}, s * 1000 );
} else {
Mgr.fadeInSubtitle( s );
}
break;
case "toc" :
$( 'tw-link' ).css( 'color', '#00cc99');
break;
}
});
};
Mgr.fadeInSubtitle = function( s ) {
$( '.subtitle' ).css( 'opacity', '1' );
$( '.subtitle' ).on( 'transitionend webkitTransitionEnd', function() {
var to = setTimeout( function() {
Mgr.fadeOutTitle( s );
clearTimeout( to );
}, s * 1000 );
});
};
Mgr.fadeOutTitle = function( s ) {
var str = ".fade-" + s.toString();
$( str ).css( 'opacity', '0' );
$( str ).on( 'transitionend webkitTransitionEnd', function() {
if ( $( str ).css( 'opacity' ) == 1 ) {
return;
}
harlowe.State.variables.gotoscn = 1;
});
};
Mgr.setFooterWidth = function() {
$( "#footer-custom-width" ).removeClass();
switch( harlowe.State.variables.width ) {
case 700 :
$( "#footer-custom-width" ).addClass( "width-700" );
break;
case 800 :
$( "#footer-custom-width" ).addClass( "width-800" );
break;
case 900 :
$( "#footer-custom-width" ).addClass( "width-900" );
break;
default :
$( "#footer-custom-width" ).addClass( "width-700" );
break;
}
};
Mgr.fadeToWhite = function( t ) {
var to = setTimeout( ()=> {
clearTimeout( to );
$( "tw-story" ).css( "transition:", "background-color 20.0s ease-in-out" );
$( "tw-story" ).css( "-webkit-transition", "background-color 20.0s ease-in-out" );
$( "tw-story" ).css( "background-color", "#fff" );
},
t
);
}
Mgr.fadeToBlack = function() {
$( 'tw-story' ).css( 'transition', 'background-color 1.5s ease-in-out' );
$( 'tw-story' ).css( '-webkit-transition', 'background-color 1.5s ease-in-out' );
$( "tw-story" ).css( "background-color", "#000" );
}
</script>\
{
(set: $titles to
(a:
"Marginalia",
"In Their Names",
"unidentified congregant",
"Father of Microbiology",
"New Future @ prayer",
"Book of Common Prayer, Communal Response",
"New Future to Glaucous",
"On Glaucous",
"Letter from Glaucous to New Future",
"From objects of prayer to a bedtime story",
"Letter"
)
)
(set: $subtitles to
(a:
"//found in first edition, Book of Common Prayer//",
"//(liturgical)//",
"//(ephemera)//",
"//Leeuwenhoek & his microscope (sermon by Glaucous)//",
"//(provenance unknown)//",
"//(liturgical)//",
"//(transcribed by unknown congregant)//",
"//New Future speaks/canonical dissent/unverified origin//",
"//annotated Book of Reflection//",
"//(unknown congregant, folklore)//",
"//(provenance unknown, found in Isafjordur cave)//"
)
)
(set: $int1 to 1s)
(set: $int15 to 1.5s)
(set: $int2 to 2s)
(set: $int25 to 2.5s)
(set: $int3 to 3s)
(set: $int35 to 3.5s)
(set: $int4 to 4s)
(set: $int45 to 4.5s)
(set: $int5 to 5s)
(set: $audio to -1)
(set: $read to 0)
(set: $current to -1)
(set: $script to 0)
(set: $timer to -1)
(set: $gotoscn to -1)
(set: $finished to -1)
(set: $t1s to (transition:"dissolve") + (transition-time: 1s))
(set: $t2s to (transition:"dissolve") + (transition-time: 2s))
(set: $t3s to (transition:"dissolve") + (transition-time: 3s))
(set: $t5s to (transition:"dissolve") + (transition-time: 5s))
(set: $t15s to (transition:"dissolve") + (transition-time: 15s))
(set: $t10s to (transition:"dissolve") + (transition-time: 10s))
(set: $t20s to (transition:"dissolve") + (transition-time: 20s))
(set: $t25s to (transition:"dissolve") + (transition-time: 25s))
(set: $t30s to (transition:"dissolve") + (transition-time: 30s))
(set: $t40s to (transition:"dissolve") + (transition-time: 40s))
(set: $t60s to (transition:"dissolve") + (transition-time: 60s))
(set: $t70s to (transition:"dissolve") + (transition-time: 70s))
(set: $debug to 0)
}<script>
harlowe.State.variables.timer = [
0, /*intro*/
48000,
1
]
Mgr.initNextButton();
Mgr.playScene();
</script>\
(set: $width to 700)\
(if: $current is not 1)[(set: $current to 1)]\
<div id="poem" class="width-700">\
<span class="line" id="0">\
<span class="line tf70" id="1">I have a tongue that spins lichens
coaxes a fox from her winter den
I am pessimist & possibility.
Drag a fir tree behind me to dust
away my footprints but those particles
rise, tell their own story:
“Bless no more Bishop, even the wicked need a place to rest.”</span><span class="line" id="2"></span></div><script>
harlowe.State.variables.timer = [
5000, /*intro*/
34000, /*hiding in groves*/
28000, /*eat without reason*/
64000, /*we are the generation*/
15000, /*we feel relief*/
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 3)[(set: $current to 3)]\
<div id="poem" class="width-700">\
<span class="line" id="0">\
<span class="line tf40" id="1">hiding in groves, our proximity
to hanging fruit bakes it on the tree</span>
<span class="line tf20" id="2">eat without reason or want</span></span>
<span class="line tf40" id="3">we are the generation that trickled
in after The Blame, always empty or too full</span>
<span class="line tf40" id="4">we feel relief when we lose consciousness
bodies fall, shatter on impact
leave an ice patch, sour the soil
New Future stomps the ground
drumming shallow roots into
a backwards crawl, where neck deep
in water we find a boat in our breast pocket
& women sell sailing winds knotted in handkerchiefs</span><span class="line" id="4"></span></div><script>
harlowe.State.variables.timer = [
7750, /*intro*/
3500, /*buries second*/
3000, /*grieves*/
3000, /*makes a tube frome tin*/
5500, /*fills it with whiskers*/
3500, /*buries third*/
3000, /*grieves*/
2400, /*makes a tube from silver*/
2750, /*finer filaments*/
1800, /*peers through it*/
6750, /*so close so close*/
4000, /*buries fourth*/
4000, /*grieves*/
2500, /*makes a tube copper*/
3500, /*fits with finest lens*/
2000, /*scrapes glass plate*/
750, /*along the inside*/
2500, /*of his mouth*/
3000, /*inserts under lens*/
3500, /*peers through it*/
2000, /*there*/
3500, /*small, struggling*/
3500, /*stains them with saffron*/
2500, /*sees them clear*/
4000, /*furiously peddling*/
6500, /*baptizes them animicules*/
6500, /*here we teem with*/
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 4)[(set: $current to 4)]\
<div id="poem" class="width-700">\
<span class="line" id="0"></span>\
<span class="line tf2" id="1"><span class="transient" id="2">Buries his second child</span></span>
<span class="line tf2" id="2"><span class="transient" id="2">grieves</span></span>
===||||||
<span class="line tf2" id="3"><span class="transient in-2" id="4">makes a tube from tin</span></span>
|==|
<span class="line tf2" id="4"><span class="transient" id="4">fills it with whiskers of glass</span></span>
<span class="line tf2" id="5"><span class="transient" id="6">Buries his third child</span></span>
<span class="line tf2" id="6"><span class="transient" id="6">grieves</span></span>
===||||||
<span class="line tf2" id="7"><span class="transient" id="9">makes a tube of silver</span></span>
|==|
<span class="line tf2" id="8"><span class="transient" id="9">& finer filaments</span></span>
<span class="line tf2" id="9"><span class="transient" id="10">peers through it;</span></span>
<span class="line tf2" id="10"><span class="transient" id="10">(so close so close so close)</span></span>
<span class="line tf2" id="11"><span class="transient" id="12">Buries his fourth child</span></span>
<span class="line tf2" id="12"><span class="transient" id="12">grieves</span></span>
===||||||
<span class="line tf2" id="13"><span class="transient" id="14">makes a tube of copper</span></span>
|==|
<span class="line tf2" id="14"><span class="transient" id="14">fits it with his finest lens</span></span>
<span class="line tf2" id="15"><span class="transient" id="17">scrapes a glass plate</span></span>
<span class="line tf2" id="16"><span class="transient" id="17">along the inside</span></span>
<span class="line tf2" id="17"><span class="transient" id="17">of his mouth</span></span>
<span class="line tf2" id="18"><span class="transient" id="19">inserts under lens</span></span>
<span class="line tf2" id="19"><span class="transient" id="19">peers through it</span></span>
<span class="line tf2" id="20"><span class="transient" id="22">there</span></span>
<span class="line tf2" id="21"><span class="transient" id="22">small, struggling</span></span>
<span class="line tf2" id="22"><span class="transient" id="22">stains them with saffron</span></span>
<span class="line tf2" id="23"><span class="transient" id="24">sees them clear</span></span>
<span class="line tf2" id="24"><span class="transient" id="24">furiously peddling</span></span>
<span class="line tf2" id="25"><span class="transient" id="25">baptizes them Animicules</span></span>
<span class="line tf2" id="26"><span class="transient" id="26">Here we teem with painful abundance</span></span><span class="line" id="27"></span></div><script>
harlowe.State.variables.timer = [
9500, /*intro*/
11250, /**/
9000, /**/
28750, /**/
6000, /**/
24250, /**/
4000, /**/
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 800)\
(if: $current is not 7)[(set: $current to 7)]\
<div id="poem" class="width-800">\
<span class="line" id="0"></span>\
<span class="line tf2" id="1">I gave you one simple job;
keep your time piece rusted.</span>
<span class="line" id="2">Well it ticked last night.</span>
<span class="line tf30" id="3">And thin, slippery babies performed their own
C-sections as their mothers slept. I had to blanket
the hemisphere with aurora borealis fireworks
to cover their cries. I had to distract museum curators
from noticing their avian specimens' feeble thumps
as they woke in tiny glass compartments.</span>
<span class="line" id="4">Were you there for those last raspy confessions?</span>
<span class="line tf25" id="5">I traded our Gift of Homing by Sight to stop
your clock. Last time I checked help was a 2 degree
roll-back that is never coming.</span>
<span class="line" id="6">Explain That to them, Lord of Telescopes.</span><span class="line" id="7"></span></div><script>
harlowe.State.variables.timer = [
250, /*intro*/
84000,
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 8)[(set: $current to 8)]\
<div id="poem" class="width-700">\
<span class="line" id="0"></span>\
<span class="line" id="1">My brother is a long collision, a crucible
a fevered biophiliac & a pain in the ass.
He fathers ideology, parents nothing.
Skips rope with gravity, curious about chaos.
Leaves me to clean up the mess.
It was you, all of you
who gave him superhuman powers.
We were nothing. Siblings who hadn’t earned our story.
He tells us to find worship in the quieter places,
drop of moisture on stalactite, intricate dirt pathways
of fungi before they bloom.
You are tremors in an uneven deceleration.
You are the authors, why do you still call for him?
Be careful with your own story. Whatever he tells you
radiance is not your birthright.</span><span class="line" id="2"></span></div><script>
harlowe.State.variables.timer = [
6500, /*intro*/
25000,
52500,
14000,
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 800)\
(if: $current is not 9)[(set: $current to 9)]\
<div id="poem" class="width-800">\
<span class="line" id="0"></span>\
<span class="line tf20" id="1"><span class="transient-long" id="1">I spent too much time in the sky searching for a celestial crawlspace
(I had no business being there, our father, a planet that ate his own stars).
I thought the common grave would yield…Hoped if I stayed away
you wouldn’t notice the changes, law of diminishing returns.</span></span>
<span class="line tf40" id="2"><span class="transient-long" id="2">I try to move as little as possible. Spend days/years? thinking
about how our mother covered her face with a blanket of pollen
so we wouldn’t know her. Left us in a cave with bees to feed us.
In-utero we pretended to be ravens swimming round each other.
You came out first: quadruped. Me second: biped. You telling
me I was made from your leftovers. Me screaming. You laughing.
Me screaming harder for you to take it back, then…a mouth full
of bees buzzing me into a lulled silence. You licking honey from
my face.</span></span>
<span class="line tf10" id="3"><span class="transient-long" id="3">Sometimes I think we are back. Two birds fluttering to an absent
mother’s heartbeat. Together, content, unfinished.</span></span><span class="line" id="4"></span></div><script>
harlowe.State.variables.timer = [
11500, /*intro*/
23500,
13000,
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 800)\
(if: $current is not 10)[(set: $current to 10)]\
<div id="poem" class="width-800">\
<span class="line" id="0"></span>\
<span class="line tf3" id="1">When Glaucous died, New Future retched an ocean. It rained fish.
She picked her brother up in her mouth and started an Infinity Loop.
Perpetual motion far from Elysium where they dared each other to cross
worlds; children in one, gods in another.</span>
<span class="line tf3" id="2">After the fields failed, relics were good barter. She watched
The Glaucous Journals go for three bags of flour. The pages
were scribbled with the observations of an amateur astronomer.</span><span class="line" id="3"></span></div><script>
harlowe.State.variables.timer = [
250, /*intro*/
74000,
60000
]
Mgr.initNextButton();
Mgr.playScene();
Mgr.fadeToWhite(74250);
Mgr.finished = true;
</script>\
(set: $width to 800)\
(set: $finished to 1)\
(if: $current is not 11)[(set: $current to 11)]\
<div id="poem" class="width-800">\
<span class="line" id="0"></span>\
<span class="line tf70" id="1">You won’t get through on the dream-line. I medicate it. But if you come
I want to know. I’ll wrap my house in fish skin, set out tealights.
Look for the flicker.
I stopped walking when there was nothing left of you to carry. It took
a long time. They don’t know us anymore. I live by the water.
I walk upright. I am settled here in this patch of solution, great experiment
by careful new beings.
I found the stone whistle you left me, am learning to read the rocks—
so full of your stupid abundance.</span><span class="line" id="2"></span></div><script>Mgr.setFooterWidth()</script>\
{
(if: (passage:)'s tags contains "poem")[
<div id="footer-custom-width">
(if: $finished is 1)[
<div class="go-next"><span onclick="Mgr.goNext()">(link-goto: "Return to Catalog", "TOC")</span></div>
]
(if: $current < 11)[
<div class="go-next"><span onclick="Mgr.goNext()">(link-goto: "Next Entry", "Title Card")</span></div>
]
</div>
<div class="scroll-arrow"></div>]
}z<script>
harlowe.State.variables.timer = [
12500, /*intro*/
3500, /*when the great eye*/
5250, /*we must love*/
3750, /*when the great eye*/
5500, /*we must love*/
2750, /*a moment of silence pls*/
7750, /*for nordic countries mourning*/
2250, /*a place in iceland*/
4500, /*we know what is happening*/
4600, /*only you will know if*/
4500, /*in our church moments of*/
6100, /*tongues thick-shamed*/
3250, /*when the great eye*/
5000, /*we must love*/
4000, /*our continent traffics*/
3800, /*crashes our endocrine systems*/
3750, /*capacity to be moth spun*/
3000, /*worry over prayer books*/
6750, /*--New Arachnauts*/
3500, /*when the great eye*/
4500, /*we must love*/
2600, /*brothers, sisters*/
4750, /*we stumble in*/
3000, /*vape pens in pockets*/
4000, /*unable to look*/
3250, /*our weight buckles*/
2500, /*we are very light*/
4000, /*come for the microbes in*/
4000, /*leuwonhoecks's...*/
5500, /*he hears us...*/
3500, /*when the great eye*/
5500, /*we must love*/
3750, /*when the great eye*/
5500, /*we must love*/
3500, /*we pray for genetic*/
3500, /*desperate to ignore the truth*/
3500, /*we will never be judged*/
3500, /*which is another truth*/
3000, /*don't we feel relief?*/,
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 6)[(set: $current to 6)]\
<div id="poem" class="width-700">\
<span class="line" id="0"></span>\
<span class="line" id="1">When the Great Eye is Glaucous</span>
<span class="line" id="2">We must love what we cannot see</span>
<span class="line" id="3">When the Great Eye is Glaucous</span>
<span class="line" id="4">//We must love what we cannot see//</span>
<span class="line" id="5">a moment of silence please</span>
<span class="line" id="6">for Nordic countries mourning glacier death</span>
<span class="line" id="7">A plaque in Iceland reads:</span>
<span class="line" id="8">we know what is happening, what needs to be done</span>
<span class="line" id="9">only you will know if we did it</span>
<span class="line" id="10">in our church moments of silence pile up</span>
<span class="line" id="11">tongues-thick shamed slugs at the back of our throats</span>
<span class="line" id="12">When the Great Eye is Glaucous</span>
<span class="line" id="13">//We must love what we cannot see//</span>
<span class="line" id="14">our continent traffics in unwanted bodies</span>
<span class="line" id="15">crashes our endocrine systems, we lack</span>
<span class="line" id="16">capacity to be moth spun, watch spiders</span>
<span class="line" id="17">worry over prayer books for their cousins</span>
<span class="line" id="18">--New Arachnauts, nano-satellites in space</span>
<span class="line" id="19">When the Great Eye is Glaucous</span>
<span class="line" id="20">//We must love what we cannot see//</span>
<span class="line" id="21">Brothers, Sisters</span>
<span class="line" id="22">//we stumble in, plastic bottles in hand//</span>
<span class="line" id="23">//vape pens in pockets//</span>
<span class="line" id="24">//unable to look each other in the eye//</span>
<span class="line" id="25">//our weight buckles the floor//</span>
<span class="line" id="26">//we are very late//</span>
<span class="line" id="27">//come for the microbes in holy water//</span>
<span class="line" id="28">//—Leeuwenhoek’s Animicules//</span>
<span class="line" id="29">He hears us….he hears us</span>
<span class="line" id="30">When the Great Eye is Glaucous</span>
<span class="line" id="31">//We must love what we cannot see//</span>
<span class="line" id="32">When the Great Eye is Glaucous</span>
<span class="line" id="33">We must love what we cannot see</span>
<span class="line tf2" id="34">we pray for genetic anomalies & ascension</span>
<span class="line tf2" id="35">desperate to ignore the truth</span>
<span class="line tf2" id="36">we will never be judged</span>
<span class="line tf2" id="37">which is another truth</span>
<span class="line tf2" id="38">don’t we feel relief?</span></span><span class="line" id="39"></span></div><script>
Mgr.initFade(3,"title");
</script>\
{
(if: $debug is 1)[(goto: $titles's $current)]
<div class="fade-3">
<div class="titlecard">
(print: $titles's ($current))
</div>
<div class="subtitle">
$t2s[(print: $subtitles's ($current))]
</div>
(event: when $gotoscn is 1)[(set: $gotoscn to -1)(goto: $titles's $current)]
</div>
}<script>
Mgr.loadGame();
</script>\
{
(if: $debug is 1)[(goto: "TOC")]
(set: _incr to 0)
(click: ?incrScript0)[(set: _incr to _incr + 1)]
(click: ?incrScript1)[(set: _incr to _incr + 1)]
(click: ?incrScript2)[(set: _incr to _incr + 1)]
(click: ?incrScript3)[(set: _incr to _incr + 1)]
(click: ?incrScript4)[(set: _incr to _incr + 1)]
}\
<div class="width-900"><div class="loader" style="text-align:center; width:100%;"></div><div class="fader">\
$t2s[<center style="width:100%;">Welcome to
"Antiquities from the End of the Anthropocene/[Biophilia]<incrScript0|"</center>]\
(event: when _incr is 1)[$t2s[//Biophiliaism: [human faith practice]<incrScript1| that promoted the sanctity of sentience in all things found on Earth.//]]
(event: when _incr is 2)[$t2s[The Church of Biophilia experienced a short burst of popularity mid-21st Century. Two siblings of unknown origin, identified only as Glaucous and New Future, are credited as the architects. All known information on the siblings is contained in [The Biophilia Codex]<incrScript2|.]]
(event: when _incr is 3)[$t2s[Our archivists have collected, restored and, when possible, enhanced what evidence remains of the [Church and its congregants]<incrScript3|. All items in the catalog were recovered post-Submersed Century.]]
(event: when _incr is 4)[$t2s[For optimal perception, please enable your audio listening device and expand your viewing window to its [maximum size]<incrScript4|.]]
(event: when _incr is 5)[$t2s[<center>[[Enter Archive->Title]]</center>]]
</div></div><script>
var to = setTimeout( ()=> {
clearTimeout( to );
$( '.ack' ).css( 'opacity', '1' );
}, 1 );
</script>\
(set: $width to 800)\
<div class="width-800">\
<div class="ack tf3">\
//Fragments from the Biophilia Codex// was written by Shannon Quinn.
<hr />\
This audio archive was produced and performed by bryan depuy, griffin epstein, and Shannon Quinn.
Audio editing and post-production by bryan depuy. Twine design and additional programming also by bryan depuy.
<hr />\
Several pieces make use of generously shared audio from freesounds.org:
tomlija - "Climbing up the squeaky wooden staircase"
kyles - "Classroom students whispering presence"
dr-macak - "Class room ambient 1" & "Class room ambient 2"
daenerys - "Group of people"
soundscape-leuphana - "Turn on ventilator library"
aldelri - "Coronavirus spring night"
cuekermann - "Waterfall with nature surrounding ambience"
kangaroovindaloo - "Spinifex wind 1"
finalobserver - "Classroom talk 01"
sheyvan - "Sitting down standing up"
splicesound - "Wooden chair push in pull out"
mindhealer - "A small library in korea"
cormi - "Crowd sitting down"
kyles - "High school students settle into desks in classroom paper pens movement no voices various"
lwdickens - "Room tone stairway 1"
danielson - "Vinyl hiss"
johnsonbrandedediting - "Small crowd pre concert talking party bar walla talking"
justiiiiin - "Bells"
kyles - "Birds park city urban day busy deep skyline distant people montreal canada"
<hr />\
Built using Twine and Howler.js.
</div></div>\
{
<div id="footer-custom-width">
<span class="footer-spacer"></span>
<div class="go-next">
<span onclick="Mgr.goNext()">(link-goto: "Return to Catalog", "TOC")</span>
</div>
</div>
}<script>
harlowe.State.variables.timer = [
10000, /*intro*/
5000, /*your lazy feathered*/
5000, /*we will show*/
4600, /*the guests you need*/
3500, /*you hope they die*/
1800, /*arrive safely*/
2350, /*but don't you*/
1300, /*and aren't you*/
2100, /*standing by yourself*/
4500, /*in a house full of empty chairs*/
5000, /*we too have been far*/
5000, /*the person who loves you*/
3200, /*we locked the uncles*/
3600, /*their voices sly w shine*/
2000, /*how free did we want to be*/
3800, /*so we broke their fingers*/
4650, /*your crow jealous heart is safe here*/
4800, /*we too are for the hard work of caring*/
2850, /*double down try to please*/
1200, /*someone*/
1200, /*anyone*/
8000, /*each morning a humiliation*/
5000, /*so put on your sinner's grin &...*/
4500, /*invite us in 4x*/
3200, /*soul illumined*/
2800, /*love wrecked*/
5000, /*we will all meet*/
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 2)[(set: $current to 2)]\
<div id="poem" class="width-700">\
<span class="line" id="0"></span>\
<span class="line" id="1">Your lazy feathered future is welcome here</span>
<span class="line" id="2">We will show you how to be uncomplicated star shapes</span>
<span class="line" id="3">The guests you need walk out the door</span>
||=
<span class="line" id="4">You hope they die</span>
|||=
<span class="line" id="5">arrive safely</span>
|==|
||=
||||=
<span class="line" id="6">//but don’t you deserve it//</span>
<span class="line" id="7">//& aren't you a fool//</span>
<span class="line" id="8">//standing by yourself//</span>
<span class="line" id="9">//in a house full of empty chairs//</span>
|==|
<span class="line" id="10">We too have been far from what we are for</span>
<span class="line" id="11">The person who loves you hasn’t been born yet</span>
||=
||||=
<span class="line" id="12">//We’ve locked the uncles in the basement//</span>
<span class="line" id="13">//Their voices, sly with shine, kept asking//</span>
<span class="line" id="14">//How free did we want to be?//</span>
<span class="line" id="15">//So we broke their fingers//</span>
|==|
<span class="line" id="16">Your crow jealous heart is safe here</span>
<span class="line" id="17">We too are for the hard work of caring & when hurt</span>
<span class="line" id="18">double down, try to please</span>
|||||=
||||=
<span class="line" id="19">someone</span>
<span class="line" id="20">anyone</span>
|==|
<span class="line" id="21">//each morning a humiliation//</span>
<span class="line" id="22">So put on your sinner’s grin & a festival crown</span>
||||=
==||||=
<span class="line" id="23">//Invite us in//</span>
|==|
|||=
<span class="line" id="24">soul-illumined</span>
|||=
<span class="line" id="25">love-wrecked</span>
|==|
<span class="line" id="26">we will all meet at the common grave</span><span class="line" id="27"></span></div><script>
harlowe.State.variables.timer = [
400, /*intro*/
55000,
1
];
Mgr.playScene();
Mgr.initNextButton();
</script>\
(set: $width to 700)\
(if: $current is not 5)[(set: $current to 5)]\
<div id="poem" class="width-700">\
<span class="line" id="0"></span>\
<span class="line" id="1">sit on back porch
fist in my mouth
bits of you crumble
by the hour
we are gasoline
& used bullets
the sweet abrasion of
a mother’s tongue
incapable of apology
you used to be humble medicine
in a bucket of water
(in case I caught fire)
if you will be banjo
I will strap you to my back
busk big tent revivals
this time I will know better
refuse blessings & prayers
only accept matches</span><span class="line" id="2"></span></div>