From af82792cf24d4a8af410085c3355a6c475e4c658 Mon Sep 17 00:00:00 2001 From: Evan Pratten <ewpratten@gmail.com> Date: Sun, 1 Mar 2020 11:09:37 -0500 Subject: [PATCH] cvoid post --- _drafts/2020-02-25-Dead-Reckon.md | 12 + _drafts/2020-03-01-Corona-src.md | 399 ++++++++ assets/js/glib/gamejs/documentation.html | 282 ++++++ assets/js/glib/gamejs/game.js | 1057 ++++++++++++++++++++++ assets/js/glib/main.js | 5 + 5 files changed, 1755 insertions(+) create mode 100644 _drafts/2020-02-25-Dead-Reckon.md create mode 100644 _drafts/2020-03-01-Corona-src.md create mode 100644 assets/js/glib/gamejs/documentation.html create mode 100644 assets/js/glib/gamejs/game.js create mode 100644 assets/js/glib/main.js diff --git a/_drafts/2020-02-25-Dead-Reckon.md b/_drafts/2020-02-25-Dead-Reckon.md new file mode 100644 index 0000000..6a99c77 --- /dev/null +++ b/_drafts/2020-02-25-Dead-Reckon.md @@ -0,0 +1,12 @@ +--- +layout: post +title: "A small introduction to drivebase kinematics" +description: "Using a 4 century old technique to tell a robot where it is" +date: 2020-02-12 20:12:00 +categories: frc +redirect_from: + - /post/eb3sdf9d/ + - /eb3sdf9d/ +--- + +In my work with @frc5024's robots, I have been spending a lot of time with drivebase kinematics. \ No newline at end of file diff --git a/_drafts/2020-03-01-Corona-src.md b/_drafts/2020-03-01-Corona-src.md new file mode 100644 index 0000000..e3bd5f3 --- /dev/null +++ b/_drafts/2020-03-01-Corona-src.md @@ -0,0 +1,399 @@ +--- +layout: post +title: "The Coronavirus source code" +description: "Compile yourself an unstoppable virus from under 8KB of source" +date: 2020-03-01 10:57:00 +categories: random +redirect_from: + - /post/eb3cvo9d/ + - /eb3cvo9d/ +--- + +## Features + - Remote exploitation + - Persistance + - Cross-platform + +## Source +Here it is, the official leaked Coronavirus source code: +``` +attaaaggtttataccttcccaggtaacaaaccaaccaactttcgatctcttgtagatctgttctctaaacgaactttaa +aatctgtgtggctgtcactcggctgcatgcttagtgcactcacgcagtataattaataactaattactgtcgttgacagg +acacgagtaactcgtctatcttctgcaggctgcttacggtttcgtccgtgttgcagccgatcatcagcacatctaggttt +cgtccgggtgtgaccgaaaggtaagatggagagccttgtccctggtttcaacgagaaaacacacgtccaactcagtttgc +ctgttttacaggttcgcgacgtgctcgtacgtggctttggagactccgtggaggaggtcttatcagaggcacgtcaacat +cttaaagatggcacttgtggcttagtagaagttgaaaaaggcgttttgcctcaacttgaacagccctatgtgttcatcaa +acgttcggatgctcgaactgcacctcatggtcatgttatggttgagctggtagcagaactcgaaggcattcagtacggtc +gtagtggtgagacacttggtgtccttgtccctcatgtgggcgaaataccagtggcttaccgcaaggttcttcttcgtaag +aacggtaataaaggagctggtggccatagttacggcgccgatctaaagtcatttgacttaggcgacgagcttggcactga +tccttatgaagattttcaagaaaactggaacactaaacatagcagtggtgttacccgtgaactcatgcgtgagcttaacg +gaggggcatacactcgctatgtcgataacaacttctgtggccctgatggctaccctcttgagtgcattaaagaccttcta +gcacgtgctggtaaagcttcatgcactttgtccgaacaactggactttattgacactaagaggggtgtatactgctgccg +tgaacatgagcatgaaattgcttggtacacggaacgttctgaaaagagctatgaattgcagacaccttttgaaattaaat +tggcaaagaaatttgacaccttcaatggggaatgtccaaattttgtatttcccttaaattccataatcaagactattcaa +ccaagggttgaaaagaaaaagcttgatggctttatgggtagaattcgatctgtctatccagttgcgtcaccaaatgaatg +caaccaaatgtgcctttcaactctcatgaagtgtgatcattgtggtgaaacttcatggcagacgggcgattttgttaaag +ccacttgcgaattttgtggcactgagaatttgactaaagaaggtgccactacttgtggttacttaccccaaaatgctgtt +gttaaaatttattgtccagcatgtcacaattcagaagtaggacctgagcatagtcttgccgaataccataatgaatctgg +cttgaaaaccattcttcgtaagggtggtcgcactattgcctttggaggctgtgtgttctcttatgttggttgccataaca +agtgtgcctattgggttccacgtgctagcgctaacataggttgtaaccatacaggtgttgttggagaaggttccgaaggt +cttaatgacaaccttcttgaaatactccaaaaagagaaagtcaacatcaatattgttggtgactttaaacttaatgaaga +gatcgccattattttggcatctttttctgcttccacaagtgcttttgtggaaactgtgaaaggtttggattataaagcat +tcaaacaaattgttgaatcctgtggtaattttaaagttacaaaaggaaaagctaaaaaaggtgcctggaatattggtgaa +cagaaatcaatactgagtcctctttatgcatttgcatcagaggctgctcgtgttgtacgatcaattttctcccgcactct +tgaaactgctcaaaattctgtgcgtgttttacagaaggccgctataacaatactagatggaatttcacagtattcactga +gactcattgatgctatgatgttcacatctgatttggctactaacaatctagttgtaatggcctacattacaggtggtgtt +gttcagttgacttcgcagtggctaactaacatctttggcactgtttatgaaaaactcaaacccgtccttgattggcttga +agagaagtttaaggaaggtgtagagtttcttagagacggttgggaaattgttaaatttatctcaacctgtgcttgtgaaa +ttgtcggtggacaaattgtcacctgtgcaaaggaaattaaggagagtgttcagacattctttaagcttgtaaataaattt +ttggctttgtgtgctgactctatcattattggtggagctaaacttaaagccttgaatttaggtgaaacatttgtcacgca +ctcaaagggattgtacagaaagtgtgttaaatccagagaagaaactggcctactcatgcctctaaaagccccaaaagaaa +ttatcttcttagagggagaaacacttcccacagaagtgttaacagaggaagttgtcttgaaaactggtgatttacaacca +ttagaacaacctactagtgaagctgttgaagctccattggttggtacaccagtttgtattaacgggcttatgttgctcga +aatcaaagacacagaaaagtactgtgcccttgcacctaatatgatggtaacaaacaataccttcacactcaaaggcggtg +caccaacaaaggttacttttggtgatgacactgtgatagaagtgcaaggttacaagagtgtgaatatcacttttgaactt +gatgaaaggattgataaagtacttaatgagaagtgctctgcctatacagttgaactcggtacagaagtaaatgagttcgc +ctgtgttgtggcagatgctgtcataaaaactttgcaaccagtatctgaattacttacaccactgggcattgatttagatg +agtggagtatggctacatactacttatttgatgagtctggtgagtttaaattggcttcacatatgtattgttctttctac +cctccagatgaggatgaagaagaaggtgattgtgaagaagaagagtttgagccatcaactcaatatgagtatggtactga +agatgattaccaaggtaaacctttggaatttggtgccacttctgctgctcttcaacctgaagaagagcaagaagaagatt +ggttagatgatgatagtcaacaaactgttggtcaacaagacggcagtgaggacaatcagacaactactattcaaacaatt +gttgaggttcaacctcaattagagatggaacttacaccagttgttcagactattgaagtgaatagttttagtggttattt +aaaacttactgacaatgtatacattaaaaatgcagacattgtggaagaagctaaaaaggtaaaaccaacagtggttgtta +atgcagccaatgtttaccttaaacatggaggaggtgttgcaggagccttaaataaggctactaacaatgccatgcaagtt +gaatctgatgattacatagctactaatggaccacttaaagtgggtggtagttgtgttttaagcggacacaatcttgctaa +acactgtcttcatgttgtcggcccaaatgttaacaaaggtgaagacattcaacttcttaagagtgcttatgaaaatttta +atcagcacgaagttctacttgcaccattattatcagctggtatttttggtgctgaccctatacattctttaagagtttgt +gtagatactgttcgcacaaatgtctacttagctgtctttgataaaaatctctatgacaaacttgtttcaagctttttgga +aatgaagagtgaaaagcaagttgaacaaaagatcgctgagattcctaaagaggaagttaagccatttataactgaaagta +aaccttcagttgaacagagaaaacaagatgataagaaaatcaaagcttgtgttgaagaagttacaacaactctggaagaa +actaagttcctcacagaaaacttgttactttatattgacattaatggcaatcttcatccagattctgccactcttgttag +tgacattgacatcactttcttaaagaaagatgctccatatatagtgggtgatgttgttcaagagggtgttttaactgctg +tggttatacctactaaaaaggctggtggcactactgaaatgctagcgaaagctttgagaaaagtgccaacagacaattat +ataaccacttacccgggtcagggtttaaatggttacactgtagaggaggcaaagacagtgcttaaaaagtgtaaaagtgc +cttttacattctaccatctattatctctaatgagaagcaagaaattcttggaactgtttcttggaatttgcgagaaatgc +ttgcacatgcagaagaaacacgcaaattaatgcctgtctgtgtggaaactaaagccatagtttcaactatacagcgtaaa +tataagggtattaaaatacaagagggtgtggttgattatggtgctagattttacttttacaccagtaaaacaactgtagc +gtcacttatcaacacacttaacgatctaaatgaaactcttgttacaatgccacttggctatgtaacacatggcttaaatt +tggaagaagctgctcggtatatgagatctctcaaagtgccagctacagtttctgtttcttcacctgatgctgttacagcg +tataatggttatcttacttcttcttctaaaacacctgaagaacattttattgaaaccatctcacttgctggttcctataa +agattggtcctattctggacaatctacacaactaggtatagaatttcttaagagaggtgataaaagtgtatattacacta +gtaatcctaccacattccacctagatggtgaagttatcacctttgacaatcttaagacacttctttctttgagagaagtg +aggactattaaggtgtttacaacagtagacaacattaacctccacacgcaagttgtggacatgtcaatgacatatggaca +acagtttggtccaacttatttggatggagctgatgttactaaaataaaacctcataattcacatgaaggtaaaacatttt +atgttttacctaatgatgacactctacgtgttgaggcttttgagtactaccacacaactgatcctagttttctgggtagg +tacatgtcagcattaaatcacactaaaaagtggaaatacccacaagttaatggtttaacttctattaaatgggcagataa +caactgttatcttgccactgcattgttaacactccaacaaatagagttgaagtttaatccacctgctctacaagatgctt +attacagagcaagggctggtgaagctgctaacttttgtgcacttatcttagcctactgtaataagacagtaggtgagtta +ggtgatgttagagaaacaatgagttacttgtttcaacatgccaatttagattcttgcaaaagagtcttgaacgtggtgtg +taaaacttgtggacaacagcagacaacccttaagggtgtagaagctgttatgtacatgggcacactttcttatgaacaat +ttaagaaaggtgttcagataccttgtacgtgtggtaaacaagctacaaaatatctagtacaacaggagtcaccttttgtt +atgatgtcagcaccacctgctcagtatgaacttaagcatggtacatttacttgtgctagtgagtacactggtaattacca +gtgtggtcactataaacatataacttctaaagaaactttgtattgcatagacggtgctttacttacaaagtcctcagaat +acaaaggtcctattacggatgttttctacaaagaaaacagttacacaacaaccataaaaccagttacttataaattggat +ggtgttgtttgtacagaaattgaccctaagttggacaattattataagaaagacaattcttatttcacagagcaaccaat +tgatcttgtaccaaaccaaccatatccaaacgcaagcttcgataattttaagtttgtatgtgataatatcaaatttgctg +atgatttaaaccagttaactggttataagaaacctgcttcaagagagcttaaagttacatttttccctgacttaaatggt +gatgtggtggctattgattataaacactacacaccctcttttaagaaaggagctaaattgttacataaacctattgtttg +gcatgttaacaatgcaactaataaagccacgtataaaccaaatacctggtgtatacgttgtctttggagcacaaaaccag +ttgaaacatcaaattcgtttgatgtactgaagtcagaggacgcgcagggaatggataatcttgcctgcgaagatctaaaa +ccagtctctgaagaagtagtggaaaatcctaccatacagaaagacgttcttgagtgtaatgtgaaaactaccgaagttgt +aggagacattatacttaaaccagcaaataatagtttaaaaattacagaagaggttggccacacagatctaatggctgctt +atgtagacaattctagtcttactattaagaaacctaatgaattatctagagtattaggtttgaaaacccttgctactcat +ggtttagctgctgttaatagtgtcccttgggatactatagctaattatgctaagccttttcttaacaaagttgttagtac +aactactaacatagttacacggtgtttaaaccgtgtttgtactaattatatgccttatttctttactttattgctacaat +tgtgtacttttactagaagtacaaattctagaattaaagcatctatgccgactactatagcaaagaatactgttaagagt +gtcggtaaattttgtctagaggcttcatttaattatttgaagtcacctaatttttctaaactgataaatattataatttg +gtttttactattaagtgtttgcctaggttctttaatctactcaaccgctgctttaggtgttttaatgtctaatttaggca +tgccttcttactgtactggttacagagaaggctatttgaactctactaatgtcactattgcaacctactgtactggttct +ataccttgtagtgtttgtcttagtggtttagattctttagacacctatccttctttagaaactatacaaattaccatttc +atcttttaaatgggatttaactgcttttggcttagttgcagagtggtttttggcatatattcttttcactaggtttttct +atgtacttggattggctgcaatcatgcaattgtttttcagctattttgcagtacattttattagtaattcttggcttatg +tggttaataattaatcttgtacaaatggccccgatttcagctatggttagaatgtacatcttctttgcatcattttatta +tgtatggaaaagttatgtgcatgttgtagacggttgtaattcatcaacttgtatgatgtgttacaaacgtaatagagcaa +caagagtcgaatgtacaactattgttaatggtgttagaaggtccttttatgtctatgctaatggaggtaaaggcttttgc +aaactacacaattggaattgtgttaattgtgatacattctgtgctggtagtacatttattagtgatgaagttgcgagaga +cttgtcactacagtttaaaagaccaataaatcctactgaccagtcttcttacatcgttgatagtgttacagtgaagaatg +gttccatccatctttactttgataaagctggtcaaaagacttatgaaagacattctctctctcattttgttaacttagac +aacctgagagctaataacactaaaggttcattgcctattaatgttatagtttttgatggtaaatcaaaatgtgaagaatc +atctgcaaaatcagcgtctgtttactacagtcagcttatgtgtcaacctatactgttactagatcaggcattagtgtctg +atgttggtgatagtgcggaagttgcagttaaaatgtttgatgcttacgttaatacgttttcatcaacttttaacgtacca +atggaaaaactcaaaacactagttgcaactgcagaagctgaacttgcaaagaatgtgtccttagacaatgtcttatctac +ttttatttcagcagctcggcaagggtttgttgattcagatgtagaaactaaagatgttgttgaatgtcttaaattgtcac +atcaatctgacatagaagttactggcgatagttgtaataactatatgctcacctataacaaagttgaaaacatgacaccc +cgtgaccttggtgcttgtattgactgtagtgcgcgtcatattaatgcgcaggtagcaaaaagtcacaacattgctttgat +atggaacgttaaagatttcatgtcattgtctgaacaactacgaaaacaaatacgtagtgctgctaaaaagaataacttac +cttttaagttgacatgtgcaactactagacaagttgttaatgttgtaacaacaaagatagcacttaagggtggtaaaatt +gttaataattggttgaagcagttaattaaagttacacttgtgttcctttttgttgctgctattttctatttaataacacc +tgttcatgtcatgtctaaacatactgacttttcaagtgaaatcataggatacaaggctattgatggtggtgtcactcgtg +acatagcatctacagatacttgttttgctaacaaacatgctgattttgacacatggtttagccagcgtggtggtagttat +actaatgacaaagcttgcccattgattgctgcagtcataacaagagaagtgggttttgtcgtgcctggtttgcctggcac +gatattacgcacaactaatggtgactttttgcatttcttacctagagtttttagtgcagttggtaacatctgttacacac +catcaaaacttatagagtacactgactttgcaacatcagcttgtgttttggctgctgaatgtacaatttttaaagatgct +tctggtaagccagtaccatattgttatgataccaatgtactagaaggttctgttgcttatgaaagtttacgccctgacac +acgttatgtgctcatggatggctctattattcaatttcctaacacctaccttgaaggttctgttagagtggtaacaactt +ttgattctgagtactgtaggcacggcacttgtgaaagatcagaagctggtgtttgtgtatctactagtggtagatgggta +cttaacaatgattattacagatctttaccaggagttttctgtggtgtagatgctgtaaatttacttactaatatgtttac +accactaattcaacctattggtgctttggacatatcagcatctatagtagctggtggtattgtagctatcgtagtaacat +gccttgcctactattttatgaggtttagaagagcttttggtgaatacagtcatgtagttgcctttaatactttactattc +cttatgtcattcactgtactctgtttaacaccagtttactcattcttacctggtgtttattctgttatttacttgtactt +gacattttatcttactaatgatgtttcttttttagcacatattcagtggatggttatgttcacacctttagtacctttct +ggataacaattgcttatatcatttgtatttccacaaagcatttctattggttctttagtaattacctaaagagacgtgta +gtctttaatggtgtttcctttagtacttttgaagaagctgcgctgtgcacctttttgttaaataaagaaatgtatctaaa +gttgcgtagtgatgtgctattacctcttacgcaatataatagatacttagctctttataataagtacaagtattttagtg +gagcaatggatacaactagctacagagaagctgcttgttgtcatctcgcaaaggctctcaatgacttcagtaactcaggt +tctgatgttctttaccaaccaccacaaacctctatcacctcagctgttttgcagagtggttttagaaaaatggcattccc +atctggtaaagttgagggttgtatggtacaagtaacttgtggtacaactacacttaacggtctttggcttgatgacgtag +tttactgtccaagacatgtgatctgcacctctgaagacatgcttaaccctaattatgaagatttactcattcgtaagtct +aatcataatttcttggtacaggctggtaatgttcaactcagggttattggacattctatgcaaaattgtgtacttaagct +taaggttgatacagccaatcctaagacacctaagtataagtttgttcgcattcaaccaggacagactttttcagtgttag +cttgttacaatggttcaccatctggtgtttaccaatgtgctatgaggcccaatttcactattaagggttcattccttaat +ggttcatgtggtagtgttggttttaacatagattatgactgtgtctctttttgttacatgcaccatatggaattaccaac +tggagttcatgctggcacagacttagaaggtaacttttatggaccttttgttgacaggcaaacagcacaagcagctggta +cggacacaactattacagttaatgttttagcttggttgtacgctgctgttataaatggagacaggtggtttctcaatcga +tttaccacaactcttaatgactttaaccttgtggctatgaagtacaattatgaacctctaacacaagaccatgttgacat +actaggacctctttctgctcaaactggaattgccgttttagatatgtgtgcttcattaaaagaattactgcaaaatggta +tgaatggacgtaccatattgggtagtgctttattagaagatgaatttacaccttttgatgttgttagacaatgctcaggt +gttactttccaaagtgcagtgaaaagaacaatcaagggtacacaccactggttgttactcacaattttgacttcactttt +agttttagtccagagtactcaatggtctttgttcttttttttgtatgaaaatgcctttttaccttttgctatgggtatta +ttgctatgtctgcttttgcaatgatgtttgtcaaacataagcatgcatttctctgtttgtttttgttaccttctcttgcc +actgtagcttattttaatatggtctatatgcctgctagttgggtgatgcgtattatgacatggttggatatggttgatac +tagtttgtctggttttaagctaaaagactgtgttatgtatgcatcagctgtagtgttactaatccttatgacagcaagaa +ctgtgtatgatgatggtgctaggagagtgtggacacttatgaatgtcttgacactcgtttataaagtttattatggtaat +gctttagatcaagccatttccatgtgggctcttataatctctgttacttctaactactcaggtgtagttacaactgtcat +gtttttggccagaggtattgtttttatgtgtgttgagtattgccctattttcttcataactggtaatacacttcagtgta +taatgctagtttattgtttcttaggctatttttgtacttgttactttggcctcttttgtttactcaaccgctactttaga +ctgactcttggtgtttatgattacttagtttctacacaggagtttagatatatgaattcacagggactactcccacccaa +gaatagcatagatgccttcaaactcaacattaaattgttgggtgttggtggcaaaccttgtatcaaagtagccactgtac +agtctaaaatgtcagatgtaaagtgcacatcagtagtcttactctcagttttgcaacaactcagagtagaatcatcatct +aaattgtgggctcaatgtgtccagttacacaatgacattctcttagctaaagatactactgaagcctttgaaaaaatggt +ttcactactttctgttttgctttccatgcagggtgctgtagacataaacaagctttgtgaagaaatgctggacaacaggg +caaccttacaagctatagcctcagagtttagttcccttccatcatatgcagcttttgctactgctcaagaagcttatgag +caggctgttgctaatggtgattctgaagttgttcttaaaaagttgaagaagtctttgaatgtggctaaatctgaatttga +ccgtgatgcagccatgcaacgtaagttggaaaagatggctgatcaagctatgacccaaatgtataaacaggctagatctg +aggacaagagggcaaaagttactagtgctatgcagacaatgcttttcactatgcttagaaagttggataatgatgcactc +aacaacattatcaacaatgcaagagatggttgtgttcccttgaacataatacctcttacaacagcagccaaactaatggt +tgtcataccagactataacacatataaaaatacgtgtgatggtacaacatttacttatgcatcagcattgtgggaaatcc +aacaggttgtagatgcagatagtaaaattgttcaacttagtgaaattagtatggacaattcacctaatttagcatggcct +cttattgtaacagctttaagggccaattctgctgtcaaattacagaataatgagcttagtcctgttgcactacgacagat +gtcttgtgctgccggtactacacaaactgcttgcactgatgacaatgcgttagcttactacaacacaacaaagggaggta +ggtttgtacttgcactgttatccgatttacaggatttgaaatgggctagattccctaagagtgatggaactggtactatc +tatacagaactggaaccaccttgtaggtttgttacagacacacctaaaggtcctaaagtgaagtatttatactttattaa +aggattaaacaacctaaatagaggtatggtacttggtagtttagctgccacagtacgtctacaagctggtaatgcaacag +aagtgcctgccaattcaactgtattatctttctgtgcttttgctgtagatgctgctaaagcttacaaagattatctagct +agtgggggacaaccaatcactaattgtgttaagatgttgtgtacacacactggtactggtcaggcaataacagttacacc +ggaagccaatatggatcaagaatcctttggtggtgcatcgtgttgtctgtactgccgttgccacatagatcatccaaatc +ctaaaggattttgtgacttaaaaggtaagtatgtacaaatacctacaacttgtgctaatgaccctgtgggttttacactt +aaaaacacagtctgtaccgtctgcggtatgtggaaaggttatggctgtagttgtgatcaactccgcgaacccatgcttca +gtcagctgatgcacaatcgtttttaaacgggtttgcggtgtaagtgcagcccgtcttacaccgtgcggcacaggcactag +tactgatgtcgtatacagggcttttgacatctacaatgataaagtagctggttttgctaaattcctaaaaactaattgtt +gtcgcttccaagaaaaggacgaagatgacaatttaattgattcttactttgtagttaagagacacactttctctaactac +caacatgaagaaacaatttataatttacttaaggattgtccagctgttgctaaacatgacttctttaagtttagaataga +cggtgacatggtaccacatatatcacgtcaacgtcttactaaatacacaatggcagacctcgtctatgctttaaggcatt +ttgatgaaggtaattgtgacacattaaaagaaatacttgtcacatacaattgttgtgatgatgattatttcaataaaaag +gactggtatgattttgtagaaaacccagatatattacgcgtatacgccaacttaggtgaacgtgtacgccaagctttgtt +aaaaacagtacaattctgtgatgccatgcgaaatgctggtattgttggtgtactgacattagataatcaagatctcaatg +gtaactggtatgatttcggtgatttcatacaaaccacgccaggtagtggagttcctgttgtagattcttattattcattg +ttaatgcctatattaaccttgaccagggctttaactgcagagtcacatgttgacactgacttaacaaagccttacattaa +gtgggatttgttaaaatatgacttcacggaagagaggttaaaactctttgaccgttattttaaatattgggatcagacat +accacccaaattgtgttaactgtttggatgacagatgcattctgcattgtgcaaactttaatgttttattctctacagtg +ttcccacctacaagttttggaccactagtgagaaaaatatttgttgatggtgttccatttgtagtttcaactggatacca +cttcagagagctaggtgttgtacataatcaggatgtaaacttacatagctctagacttagttttaaggaattacttgtgt +atgctgctgaccctgctatgcacgctgcttctggtaatctattactagataaacgcactacgtgcttttcagtagctgca +cttactaacaatgttgcttttcaaactgtcaaacccggtaattttaacaaagacttctatgactttgctgtgtctaaggg +tttctttaaggaaggaagttctgttgaattaaaacacttcttctttgctcaggatggtaatgctgctatcagcgattatg +actactatcgttataatctaccaacaatgtgtgatatcagacaactactatttgtagttgaagttgttgataagtacttt +gattgttacgatggtggctgtattaatgctaaccaagtcatcgtcaacaacctagacaaatcagctggttttccatttaa +taaatggggtaaggctagactttattatgattcaatgagttatgaggatcaagatgcacttttcgcatatacaaaacgta +atgtcatccctactataactcaaatgaatcttaagtatgccattagtgcaaagaatagagctcgcaccgtagctggtgtc +tctatctgtagtactatgaccaatagacagtttcatcaaaaattattgaaatcaatagccgccactagaggagctactgt +agtaattggaacaagcaaattctatggtggttggcacaacatgttaaaaactgtttatagtgatgtagaaaaccctcacc +ttatgggttgggattatcctaaatgtgatagagccatgcctaacatgcttagaattatggcctcacttgttcttgctcgc +aaacatacaacgtgttgtagcttgtcacaccgtttctatagattagctaatgagtgtgctcaagtattgagtgaaatggt +catgtgtggcggttcactatatgttaaaccaggtggaacctcatcaggagatgccacaactgcttatgctaatagtgttt +ttaacatttgtcaagctgtcacggccaatgttaatgcacttttatctactgatggtaacaaaattgccgataagtatgtc +cgcaatttacaacacagactttatgagtgtctctatagaaatagagatgttgacacagactttgtgaatgagttttacgc +atatttgcgtaaacatttctcaatgatgatactctctgacgatgctgttgtgtgtttcaatagcacttatgcatctcaag +gtctagtggctagcataaagaactttaagtcagttctttattatcaaaacaatgtttttatgtctgaagcaaaatgttgg +actgagactgaccttactaaaggacctcatgaattttgctctcaacatacaatgctagttaaacagggtgatgattatgt +gtaccttccttacccagatccatcaagaatcctaggggccggctgttttgtagatgatatcgtaaaaacagatggtacac +ttatgattgaacggttcgtgtctttagctatagatgcttacccacttactaaacatcctaatcaggagtatgctgatgtc +tttcatttgtacttacaatacataagaaagctacatgatgagttaacaggacacatgttagacatgtattctgttatgct +tactaatgataacacttcaaggtattgggaacctgagttttatgaggctatgtacacaccgcatacagtcttacaggctg +ttggggcttgtgttctttgcaattcacagacttcattaagatgtggtgcttgcatacgtagaccattcttatgttgtaaa +tgctgttacgaccatgtcatatcaacatcacataaattagtcttgtctgttaatccgtatgtttgcaatgctccaggttg +tgatgtcacagatgtgactcaactttacttaggaggtatgagctattattgtaaatcacataaaccacccattagttttc +cattgtgtgctaatggacaagtttttggtttatataaaaatacatgtgttggtagcgataatgttactgactttaatgca +attgcaacatgtgactggacaaatgctggtgattacattttagctaacacctgtactgaaagactcaagctttttgcagc +agaaacgctcaaagctactgaggagacatttaaactgtcttatggtattgctactgtacgtgaagtgctgtctgacagag +aattacatctttcatgggaagttggtaaacctagaccaccacttaaccgaaattatgtctttactggttatcgtgtaact +aaaaacagtaaagtacaaataggagagtacacctttgaaaaaggtgactatggtgatgctgttgtttaccgaggtacaac +aacttacaaattaaatgttggtgattattttgtgctgacatcacatacagtaatgccattaagtgcacctacactagtgc +cacaagagcactatgttagaattactggcttatacccaacactcaatatctcagatgagttttctagcaatgttgcaaat +tatcaaaaggttggtatgcaaaagtattctacactccagggaccacctggtactggtaagagtcattttgctattggcct +agctctctactacccttctgctcgcatagtgtatacagcttgctctcatgccgctgttgatgcactatgtgagaaggcat +taaaatatttgcctatagataaatgtagtagaattatacctgcacgtgctcgtgtagagtgttttgataaattcaaagtg +aattcaacattagaacagtatgtcttttgtactgtaaatgcattgcctgagacgacagcagatatagttgtctttgatga +aatttcaatggccacaaattatgatttgagtgttgtcaatgccagattacgtgctaagcactatgtgtacattggcgacc +ctgctcaattacctgcaccacgcacattgctaactaagggcacactagaaccagaatatttcaattcagtgtgtagactt +atgaaaactataggtccagacatgttcctcggaacttgtcggcgttgtcctgctgaaattgttgacactgtgagtgcttt +ggtttatgataataagcttaaagcacataaagacaaatcagctcaatgctttaaaatgttttataagggtgttatcacgc +atgatgtttcatctgcaattaacaggccacaaataggcgtggtaagagaattccttacacgtaaccctgcttggagaaaa +gctgtctttatttcaccttataattcacagaatgctgtagcctcaaagattttgggactaccaactcaaactgttgattc +atcacagggctcagaatatgactatgtcatattcactcaaaccactgaaacagctcactcttgtaatgtaaacagattta +atgttgctattaccagagcaaaagtaggcatactttgcataatgtctgatagagacctttatgacaagttgcaatttaca +agtcttgaaattccacgtaggaatgtggcaactttacaagctgaaaatgtaacaggactctttaaagattgtagtaaggt +aatcactgggttacatcctacacaggcacctacacacctcagtgttgacactaaattcaaaactgaaggtttatgtgttg +acatacctggcatacctaaggacatgacctatagaagactcatctctatgatgggttttaaaatgaattatcaagttaat +ggttaccctaacatgtttatcacccgcgaagaagctataagacatgtacgtgcatggattggcttcgatgtcgaggggtg +tcatgctactagagaagctgttggtaccaatttacctttacagctaggtttttctacaggtgttaacctagttgctgtac +ctacaggttatgttgatacacctaataatacagatttttccagagttagtgctaaaccaccgcctggagatcaatttaaa +cacctcataccacttatgtacaaaggacttccttggaatgtagtgcgtataaagattgtacaaatgttaagtgacacact +taaaaatctctctgacagagtcgtatttgtcttatgggcacatggctttgagttgacatctatgaagtattttgtgaaaa +taggacctgagcgcacctgttgtctatgtgatagacgtgccacatgcttttccactgcttcagacacttatgcctgttgg +catcattctattggatttgattacgtctataatccgtttatgattgatgttcaacaatggggttttacaggtaacctaca +aagcaaccatgatctgtattgtcaagtccatggtaatgcacatgtagctagttgtgatgcaatcatgactaggtgtctag +ctgtccacgagtgctttgttaagcgtgttgactggactattgaatatcctataattggtgatgaactgaagattaatgcg +gcttgtagaaaggttcaacacatggttgttaaagctgcattattagcagacaaattcccagttcttcacgacattggtaa +ccctaaagctattaagtgtgtacctcaagctgatgtagaatggaagttctatgatgcacagccttgtagtgacaaagctt +ataaaatagaagaattattctattcttatgccacacattctgacaaattcacagatggtgtatgcctattttggaattgc +aatgtcgatagatatcctgctaattccattgtttgtagatttgacactagagtgctatctaaccttaacttgcctggttg +tgatggtggcagtttgtatgtaaataaacatgcattccacacaccagcttttgataaaagtgcttttgttaatttaaaac +aattaccatttttctattactctgacagtccatgtgagtctcatggaaaacaagtagtgtcagatatagattatgtacca +ctaaagtctgctacgtgtataacacgttgcaatttaggtggtgctgtctgtagacatcatgctaatgagtacagattgta +tctcgatgcttataacatgatgatctcagctggctttagcttgtgggtttacaaacaatttgatacttataacctctgga +acacttttacaagacttcagagtttagaaaatgtggcttttaatgttgtaaataagggacactttgatggacaacagggt +gaagtaccagtttctatcattaataacactgtttacacaaaagttgatggtgttgatgtagaattgtttgaaaataaaac +aacattacctgttaatgtagcatttgagctttgggctaagcgcaacattaaaccagtaccagaggtgaaaatactcaata +atttgggtgtggacattgctgctaatactgtgatctgggactacaaaagagatgctccagcacatatatctactattggt +gtttgttctatgactgacatagccaagaaaccaactgaaacgatttgtgcaccactcactgtcttttttgatggtagagt +tgatggtcaagtagacttatttagaaatgcccgtaatggtgttcttattacagaaggtagtgttaaaggtttacaaccat +ctgtaggtcccaaacaagctagtcttaatggagtcacattaattggagaagccgtaaaaacacagttcaattattataag +aaagttgatggtgttgtccaacaattacctgaaacttactttactcagagtagaaatttacaagaatttaaacccaggag +tcaaatggaaattgatttcttagaattagctatggatgaattcattgaacggtataaattagaaggctatgccttcgaac +atatcgtttatggagattttagtcatagtcagttaggtggtttacatctactgattggactagctaaacgttttaaggaa +tcaccttttgaattagaagattttattcctatggacagtacagttaaaaactatttcataacagatgcgcaaacaggttc +atctaagtgtgtgtgttctgttattgatttattacttgatgattttgttgaaataataaaatcccaagatttatctgtag +tttctaaggttgtcaaagtgactattgactatacagaaatttcatttatgctttggtgtaaagatggccatgtagaaaca +ttttacccaaaattacaatctagtcaagcgtggcaaccgggtgttgctatgcctaatctttacaaaatgcaaagaatgct +attagaaaagtgtgaccttcaaaattatggtgatagtgcaacattacctaaaggcataatgatgaatgtcgcaaaatata +ctcaactgtgtcaatatttaaacacattaacattagctgtaccctataatatgagagttatacattttggtgctggttct +gataaaggagttgcaccaggtacagctgttttaagacagtggttgcctacgggtacgctgcttgtcgattcagatcttaa +tgactttgtctctgatgcagattcaactttgattggtgattgtgcaactgtacatacagctaataaatgggatctcatta +ttagtgatatgtacgaccctaagactaaaaatgttacaaaagaaaatgactctaaagagggttttttcacttacatttgt +gggtttatacaacaaaagctagctcttggaggttccgtggctataaagataacagaacattcttggaatgctgatcttta +taagctcatgggacacttcgcatggtggacagcctttgttactaatgtgaatgcgtcatcatctgaagcatttttaattg +gatgtaattatcttggcaaaccacgcgaacaaatagatggttatgtcatgcatgcaaattacatattttggaggaataca +aatccaattcagttgtcttcctattctttatttgacatgagtaaatttccccttaaattaaggggtactgctgttatgtc +tttaaaagaaggtcaaatcaatgatatgattttatctcttcttagtaaaggtagacttataattagagaaaacaacagag +ttgttatttctagtgatgttcttgttaacaactaaacgaacaatgtttgtttttcttgttttattgccactagtctctag +tcagtgtgttaatcttacaaccagaactcaattaccccctgcatacactaattctttcacacgtggtgtttattaccctg +acaaagttttcagatcctcagttttacattcaactcaggacttgttcttacctttcttttccaatgttacttggttccat +gctatacatgtctctgggaccaatggtactaagaggtttgataaccctgtcctaccatttaatgatggtgtttattttgc +ttccactgagaagtctaacataataagaggctggatttttggtactactttagattcgaagacccagtccctacttattg +ttaataacgctactaatgttgttattaaagtctgtgaatttcaattttgtaatgatccatttttgggtgtttattaccac +aaaaacaacaaaagttggatggaaagtgagttcagagtttattctagtgcgaataattgcacttttgaatatgtctctca +gccttttcttatggaccttgaaggaaaacagggtaatttcaaaaatcttagggaatttgtgtttaagaatattgatggtt +attttaaaatatattctaagcacacgcctattaatttagtgcgtgatctccctcagggtttttcggctttagaaccattg +gtagatttgccaataggtattaacatcactaggtttcaaactttacttgctttacatagaagttatttgactcctggtga +ttcttcttcaggttggacagctggtgctgcagcttattatgtgggttatcttcaacctaggacttttctattaaaatata +atgaaaatggaaccattacagatgctgtagactgtgcacttgaccctctctcagaaacaaagtgtacgttgaaatccttc +actgtagaaaaaggaatctatcaaacttctaactttagagtccaaccaacagaatctattgttagatttcctaatattac +aaacttgtgcccttttggtgaagtttttaacgccaccagatttgcatctgtttatgcttggaacaggaagagaatcagca +actgtgttgctgattattctgtcctatataattccgcatcattttccacttttaagtgttatggagtgtctcctactaaa +ttaaatgatctctgctttactaatgtctatgcagattcatttgtaattagaggtgatgaagtcagacaaatcgctccagg +gcaaactggaaagattgctgattataattataaattaccagatgattttacaggctgcgttatagcttggaattctaaca +atcttgattctaaggttggtggtaattataattacctgtatagattgtttaggaagtctaatctcaaaccttttgagaga +gatatttcaactgaaatctatcaggccggtagcacaccttgtaatggtgttgaaggttttaattgttactttcctttaca +atcatatggtttccaacccactaatggtgttggttaccaaccatacagagtagtagtactttcttttgaacttctacatg +caccagcaactgtttgtggacctaaaaagtctactaatttggttaaaaacaaatgtgtcaatttcaacttcaatggttta +acaggcacaggtgttcttactgagtctaacaaaaagtttctgcctttccaacaatttggcagagacattgctgacactac +tgatgctgtccgtgatccacagacacttgagattcttgacattacaccatgttcttttggtggtgtcagtgttataacac +caggaacaaatacttctaaccaggttgctgttctttatcaggatgttaactgcacagaagtccctgttgctattcatgca +gatcaacttactcctacttggcgtgtttattctacaggttctaatgtttttcaaacacgtgcaggctgtttaataggggc +tgaacatgtcaacaactcatatgagtgtgacatacccattggtgcaggtatatgcgctagttatcagactcagactaatt +ctcctcggcgggcacgtagtgtagctagtcaatccatcattgcctacactatgtcacttggtgcagaaaattcagttgct +tactctaataactctattgccatacccacaaattttactattagtgttaccacagaaattctaccagtgtctatgaccaa +gacatcagtagattgtacaatgtacatttgtggtgattcaactgaatgcagcaatcttttgttgcaatatggcagttttt +gtacacaattaaaccgtgctttaactggaatagctgttgaacaagacaaaaacacccaagaagtttttgcacaagtcaaa +caaatttacaaaacaccaccaattaaagattttggtggttttaatttttcacaaatattaccagatccatcaaaaccaag +caagaggtcatttattgaagatctacttttcaacaaagtgacacttgcagatgctggcttcatcaaacaatatggtgatt +gccttggtgatattgctgctagagacctcatttgtgcacaaaagtttaacggccttactgttttgccacctttgctcaca +gatgaaatgattgctcaatacacttctgcactgttagcgggtacaatcacttctggttggacctttggtgcaggtgctgc +attacaaataccatttgctatgcaaatggcttataggtttaatggtattggagttacacagaatgttctctatgagaacc +aaaaattgattgccaaccaatttaatagtgctattggcaaaattcaagactcactttcttccacagcaagtgcacttgga +aaacttcaagatgtggtcaaccaaaatgcacaagctttaaacacgcttgttaaacaacttagctccaattttggtgcaat +ttcaagtgttttaaatgatatcctttcacgtcttgacaaagttgaggctgaagtgcaaattgataggttgatcacaggca +gacttcaaagtttgcagacatatgtgactcaacaattaattagagctgcagaaatcagagcttctgctaatcttgctgct +actaaaatgtcagagtgtgtacttggacaatcaaaaagagttgatttttgtggaaagggctatcatcttatgtccttccc +tcagtcagcacctcatggtgtagtcttcttgcatgtgacttatgtccctgcacaagaaaagaacttcacaactgctcctg +ccatttgtcatgatggaaaagcacactttcctcgtgaaggtgtctttgtttcaaatggcacacactggtttgtaacacaa +aggaatttttatgaaccacaaatcattactacagacaacacatttgtgtctggtaactgtgatgttgtaataggaattgt +caacaacacagtttatgatcctttgcaacctgaattagactcattcaaggaggagttagataaatattttaagaatcata +catcaccagatgttgatttaggtgacatctctggcattaatgcttcagttgtaaacattcaaaaagaaattgaccgcctc +aatgaggttgccaagaatttaaatgaatctctcatcgatctccaagaacttggaaagtatgagcagtatataaaatggcc +atggtacatttggctaggttttatagctggcttgattgccatagtaatggtgacaattatgctttgctgtatgaccagtt +gctgtagttgtctcaagggctgttgttcttgtggatcctgctgcaaatttgatgaagacgactctgagccagtgctcaaa +ggagtcaaattacattacacataaacgaacttatggatttgtttatgagaatcttcacaattggaactgtaactttgaag +caaggtgaaatcaaggatgctactccttcagattttgttcgcgctactgcaacgataccgatacaagcctcactcccttt +cggatggcttattgttggcgttgcacttcttgctgtttttcagagcgcttccaaaatcataaccctcaaaaagagatggc +aactagcactctccaagggtgttcactttgtttgcaacttgctgttgttgtttgtaacagtttactcacaccttttgctc +gttgctgctggccttgaagccccttttctctatctttatgctttagtctacttcttgcagagtataaactttgtaagaat +aataatgaggctttggctttgctggaaatgccgttccaaaaacccattactttatgatgccaactattttctttgctggc +atactaattgttacgactattgtataccttacaatagtgtaacttcttcaattgtcattacttcaggtgatggcacaaca +agtcctatttctgaacatgactaccagattggtggttatactgaaaaatgggaatctggagtaaaagactgtgttgtatt +acacagttacttcacttcagactattaccagctgtactcaactcaattgagtacagacactggtgttgaacatgttacct +tcttcatctacaataaaattgttgatgagcctgaagaacatgtccaaattcacacaatcgacggttcatccggagttgtt +aatccagtaatggaaccaatttatgatgaaccgacgacgactactagcgtgcctttgtaagcacaagctgatgagtacga +acttatgtactcattcgtttcggaagagacaggtacgttaatagttaatagcgtacttctttttcttgctttcgtggtat +tcttgctagttacactagccatccttactgcgcttcgattgtgtgcgtactgctgcaatattgttaacgtgagtcttgta +aaaccttctttttacgtttactctcgtgttaaaaatctgaattcttctagagttcctgatcttctggtctaaacgaacta +aatattatattagtttttctgtttggaactttaattttagccatggcagattccaacggtactattaccgttgaagagct +taaaaagctccttgaacaatggaacctagtaataggtttcctattccttacatggatttgtcttctacaatttgcctatg +ccaacaggaataggtttttgtatataattaagttaattttcctctggctgttatggccagtaactttagcttgttttgtg +cttgctgctgtttacagaataaattggatcaccggtggaattgctatcgcaatggcttgtcttgtaggcttgatgtggct +cagctacttcattgcttctttcagactgtttgcgcgtacgcgttccatgtggtcattcaatccagaaactaacattcttc +tcaacgtgccactccatggcactattctgaccagaccgcttctagaaagtgaactcgtaatcggagctgtgatccttcgt +ggacatcttcgtattgctggacaccatctaggacgctgtgacatcaaggacctgcctaaagaaatcactgttgctacatc +acgaacgctttcttattacaaattgggagcttcgcagcgtgtagcaggtgactcaggttttgctgcatacagtcgctaca +ggattggcaactataaattaaacacagaccattccagtagcagtgacaatattgctttgcttgtacagtaagtgacaaca +gatgtttcatctcgttgactttcaggttactatagcagagatattactaattattatgaggacttttaaagtttccattt +ggaatcttgattacatcataaacctcataattaaaaatttatctaagtcactaactgagaataaatattctcaattagat +gaagagcaaccaatggagattgattaaacgaacatgaaaattattcttttcttggcactgataacactcgctacttgtga +gctttatcactaccaagagtgtgttagaggtacaacagtacttttaaaagaaccttgctcttctggaacatacgagggca +attcaccatttcatcctctagctgataacaaatttgcactgacttgctttagcactcaatttgcttttgcttgtcctgac +ggcgtaaaacacgtctatcagttacgtgccagatcagtttcacctaaactgttcatcagacaagaggaagttcaagaact +ttactctccaatttttcttattgttgcggcaatagtgtttataacactttgcttcacactcaaaagaaagacagaatgat +tgaactttcattaattgacttctatttgtgctttttagcctttctgctattccttgttttaattatgcttattatctttt +ggttctcacttgaactgcaagatcataatgaaacttgtcacgcctaaacgaacatgaaatttcttgttttcttaggaatc +atcacaactgtagctgcatttcaccaagaatgtagtttacagtcatgtactcaacatcaaccatatgtagttgatgaccc +gtgtcctattcacttctattctaaatggtatattagagtaggagctagaaaatcagcacctttaattgaattgtgcgtgg +atgaggctggttctaaatcacccattcagtacatcgatatcggtaattatacagtttcctgtttaccttttacaattaat +tgccaggaacctaaattgggtagtcttgtagtgcgttgttcgttctatgaagactttttagagtatcatgacgttcgtgt +tgttttagatttcatctaaacgaacaaactaaaatgtctgataatggaccccaaaatcagcgaaatgcaccccgcattac +gtttggtggaccctcagattcaactggcagtaaccagaatggagaacgcagtggggcgcgatcaaaacaacgtcggcccc +aaggtttacccaataatactgcgtcttggttcaccgctctcactcaacatggcaaggaagaccttaaattccctcgagga +caaggcgttccaattaacaccaatagcagtccagatgaccaaattggctactaccgaagagctaccagacgaattcgtgg +tggtgacggtaaaatgaaagatctcagtccaagatggtatttctactacctaggaactgggccagaagctggacttccct +atggtgctaacaaagacggcatcatatgggttgcaactgagggagccttgaatacaccaaaagatcacattggcacccgc +aatcctgctaacaatgctgcaatcgtgctacaacttcctcaaggaacaacattgccaaaaggcttctacgcagaagggag +cagaggcggcagtcaagcctcttctcgttcctcatcacgtagtcgcaacagttcaagaaattcaactccaggcagcagta +ggggaacttctcctgctagaatggctggcaatggcggtgatgctgctcttgctttgctgctgcttgacagattgaaccag +cttgagagcaaaatgtctggtaaaggccaacaacaacaaggccaaactgtcactaagaaatctgctgctgaggcttctaa +gaagcctcggcaaaaacgtactgccactaaagcatacaatgtaacacaagctttcggcagacgtggtccagaacaaaccc +aaggaaattttggggaccaggaactaatcagacaaggaactgattacaaacattggccgcaaattgcacaatttgccccc +agcgcttcagcgttcttcggaatgtcgcgcattggcatggaagtcacaccttcgggaacgtggttgacctacacaggtgc +catcaaattggatgacaaagatccaaatttcaaagatcaagtcattttgctgaataagcatattgacgcatacaaaacat +tcccaccaacagagcctaaaaaggacaaaaagaagaaggctgatgaaactcaagccttaccgcagagacagaagaaacag +caaactgtgactcttcttcctgctgcagatttggatgatttctccaaacaattgcaacaatccatgagcagtgctgactc +aactcaggcctaaactcatgcagaccacacaaggcagatgggctatataaacgttttcgcttttccgtttacgatatata +gtctactcttgtgcagaatgaattctcgtaactacatagcacaagtagatgtagttaactttaatctcacatagcaatct +ttaatcagtgtgtaacattagggaggacttgaaagagccaccacattttcaccgaggccacgcggagtacgatcgagtgt +acagtgaacaatgctagggagagctgcctatatggaagagccctaatgtgtaaaattaattttagtagtgctatccccat +gtgattttaatagcttcttaggagaatgacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +``` + + + +### Credits +This post was inspired by [a Tweet](https://twitter.com/ortegaalfredo/status/1233360209181061120) posted by @ortegaalfredo. \ No newline at end of file diff --git a/assets/js/glib/gamejs/documentation.html b/assets/js/glib/gamejs/documentation.html new file mode 100644 index 0000000..b30b6cc --- /dev/null +++ b/assets/js/glib/gamejs/documentation.html @@ -0,0 +1,282 @@ +<!DOCTYPE html> +<html> + <head> + <title>game.js docs</title> + <style> + body { + background-color: #232323; + color: #538df1; + font-family:monospace; + } + .white { + color: #dddddd; + } + .section { + position: relative; + left: 5%; + } + .indent { + position: relative; + left: 10%; + } + .red { + color: rgb(194, 22, 56); + } + pre { + color: rgb(194, 22, 56); + } + a { + color: rgb(235, 27, 27); + } + a:hover { + color: rgb(255, 134, 134); + } + select { + padding: 5px 15px 5px 5px; + border: 3px solid #666666; + border-radius: 5px; + background-color: #232323; + color: #538df1; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + select:hover { + background-color: #333333; + } + </style> + </head> + <body> + <h1 class="white">game.js docs</h1> + <div class="section"> + <h2 class="white">Overview</h2> + <p>game.js is a file to help with making games in the html canvas. This is mainly meant for pixel art games, as the way stuff is rendered is very pixelated.</p> + <h2>Jump to</h2> + <div> + <a href="#setup">setup</a> + <a href="#structure">structure</a> + <a href="#graphics">graphics</a> + <a href="#physics">physics</a> + <a href="#audio">audio</a> + <a href="#input">input</a> + <a href="#utils">utils</a> + </div> + <a name="setup"></a> + <h2 class="white">setup</h2> + <div class="section"> + <h3>Canvas</h3> + <div class="section"> + <p>For game.js to work, there needs to be a canvas element in your html file, that has id "game"</p> + </div> + <h3>Loading Assets</h3> + <div class="section"> + <p>assign <span class="white">images</span> and <span class="white">audio</span> an array with the sources relative to the html file in which games.js is used.</p> + <p>The first string of an array will be added on to the start of following strings. Example:</p> + <pre> + images = [ + "folder1/", + "pic1.png", + [ + "subfolder/" + "pic2.png" + ], + "pic3.png" + ]; + </pre> + <p>will result in </p> + <pre> + "folder1/pic1.png", + "folder1/subfolder/pic2.png", + "folder1/pic3.png" + </pre> + </div> + <h3>Start the game</h3> + <div class="section"> + <p>After stuff in your scripts has loaded, call <span class="white">setup(framerate)</span>. Now the user can click play to start the game</p> + <p>Note: the framerate is only used for physics updates, drawing frames uses requestAnimationFrame()</p> + </div> + <h3>After assets load</h3> + <div class="section"> + <p>If you need to run code once, after all assets have been loaded,</p> + <p>create a function called <span class="white">onAssetsLoaded()</span>. If this exists in your code it will be called after assets are loaded</p> + </div> + </div> + <a name="structure"></a> + <h2 class="white">structure</h2> + <div class="section"> + <p>There are two functions that must be defined in your script, and two optional functions.</p> + <h3>Physics</h3> + <div class="section"> + <p><span class="white">update()</span> - required, will try to be called at the framerate set with <span class="white">setup(framerate)</span></p> + <p><span class="white">input()</span> - optional, if included, will try to be called every 4 milliseconds. Anything can be run here, but it is recommended to just run <a href="#input">input</a> code.</p> + </div> + <h3>Graphics</h3> + <div class="section"> + <p><span class="white">draw()</span> - required, uses requestAnimationFrame(), so frame rate will vary but is mostly 60fps.</p> + <p> functions found in <a href="#graphics">graphics</a> can be called here.</p> + <p><span class="white">absoluteDraw()</span> - optional, if included, called immediately after <span class="white">draw()</span>, same as <span class="white">draw()</span>, except graphics ignore the camera when called here. Good for things like UI.</p> + </div> + </div> + <a name="graphics"></a> + <h2 class="white">graphics</h2> + <div class="section"> + <h3>Variables</h3> + <div class="section"> + <p><span class="white">sprites</span> - images that have been loaded in. The name of a sprite is just the file name without the file extension.</p> + <p>Example: an image loaded like this: <span class="red">images = [ "assets/", "pic.png" ]</span> can be accessed like: <span class="red">sprites.pic</span></p> + <p><span class="white">canvasScale</span> - screen pixels per game pixels. Uses css to scale the canvas. This was implemented very poorly,</p> + <p>so if you want use it, try something like this: <span class="red">function update() { if(screenSize == "1:1") {canvasScale = 2} }</span></p> + <p><span class="white">cursor</span> - set a sprite as the cursor</p> + <div class="section"> + <p><span class="white">.sprite</span> - sprite to show</p> + <p><span class="white">.alignment</span> - 0 = top left, 1 = centered</p> + </div> + <p><span class="white">cw</span> - canvas width</p> + <p><span class="white">ch</span> - canvas height</p> + </div> + <h3>Functions</h3> + <div class="section"> + <p><span class="white">img(sprite, x, y, angle=0, sx=1, sy=1)</span> - draws a sprite centered on x,y. Angle is rotation in radians. sx, sy is scale x and y to draw the image at</p> + <p><span class="white">imgIgnoreCutoff(img, x, y, angle=0, sx=1, sy=1)</span> - same as img, but will draw the image even if off the canvas. If an image is larger than the canvas, it will break img(), so use this.</p> + <p>Note: color can be any HTML color as a string</p> + <p><span class="white">rect(x, y, w, h, color)</span> - draws a rectangle centered on the x,y. w is width, h is height</p> + <p><span class="white">circle(x, y, r, color)</span> - draws a circle centered on the x,y. r is radius</p> + <p><span class="white">shape(x, y, relitivePoints, color)</span> - connects the points given in relitivePoints, relative to x,y then fills in the shape. relitivePoints should be an array of points (objects with and x and y)</p> + <p>Red triangle at 100, 100 example: <span class="red">shape(100, 100, [{x:-10, y:-10}, {x:10, y:-10}, {x:0, y:10}], "red");</span></p> + <p><span class="white">text(txt, x, y, color="black", size=1, maxWidth=cw)</span> - draws the string passed into txt. x,y is the top left of the text. Default color is black. Size sets the font size to size * 8. maxWidth is how many pixels text will go to the right before wrapping.</p> + <p><span class="white">textWidth(txt, size=1)</span> - returns how many pixels wide a sting will be.</p> + </div> + <h3>Camera</h3> + <div class="section"> + <p>The camera is just an object that will offset all graphics according to its values</p> + <p><span class="white">camera</span> - object used to offset graphics</p> + <div class="section"> + <p><span class="white">.x</span> - x offset of graphics</p> + <p><span class="white">.y</span> - y offset of graphics</p> + <p><span class="white">.zoom</span> - amount graphics are scaled by. Partial numbers work, but whole numbers look better</p> + <p><span class="white">.angle</span> - angle, in radians, the graphics are rotated by</p> + </div> + <p><span class="white">centerCameraOn(x, y)</span> - centers the x and y of the camera on the x and y passed in</p> + <p><span class="white">moveCamera(x, y)</span> - moves the camera taking into account the angle. Example: move camera "forwards" <span class="red">moveCamera(0, -1)</span></p> + </div> + </div> + <a name="physics"></a> + <h2 class="white">physics</h2> + <div class="section"> + <h3>Points, Circles, and Rectangles</h3> + <div class="section"> + <p>3 different things can be used for physics (which is just collision detection), points, circles, and rectangles.</p> + <p>To have any of these, all you need is any object with the right properties.</p> + <p><span class="white">point</span> - any object with an <span class="white">x</span> and a <span class="white">y</span></p> + <p><span class="white">circle</span> - any object with an <span class="white">x</span>, <span class="white">y</span>, and <span class="white">r</span> (radius)</p> + <p><span class="white">rectangle</span> - any object with an <span class="white">x</span>, <span class="white">y</span>, <span class="white">w</span> (width), and <span class="white">h</span> (height)</p> + </div> + <h3>Collision Detection</h3> + <div class="section"> + <p>detect collision between + <select id="col1"> + <option value="rect">rect</option> + <option value="circle">circle</option> + <option value="point">point</option> + </select> + and + <select id="col2"> + <option value="rect">rect</option> + <option value="circle">circle</option> + <option value="point">point</option> + </select> + </p> + <p><span class="white" id="txtOut"></span></p> + <p>returns true if there is a collision, returns false if no collision.</p> + </div> + <h3>Misc.</h3> + <div class="section"> + <p><span class="white">dist(point, point)</span> - returns the distance between two points</p> + <p><span class="white">circleOnSideRect(circle, rect)</span> - returns a number to indicate what side of a rectangle a circle is on.</p> + <p class="section">return values: <span class="red">0 = top, 1 = right, 2 = bottom, 3 = left</span></p> + <p><span class="white">rectOnSideRect(rect, rect)</span> - returns a number to indicate what side of a rectangle a rectangle is on.</p> + </div> + </div> + <a name="audio"></a> + <h2 class="white">audio</h2> + <div class="section"> + <p><span class="white">sounds</span> - sounds defined in the <span class="white">audio</span> variable will be loaded in during <span class="white">setup(framerate)</span>, and stored in <span class="white">sounds</span></p> + <p><span class="white">play(sound)</span> - plays a sound. Example: <span class="red">play(sounds.mySound)</span></p> + <p><span class="white">setVolume(sound, volume)</span> - sets the gain for a sound. 1 is the default volume, 0 is no sound</p> + <p><span class="white">setType(sound, type)</span> - sets the type for a sound. The type is used by the built in options for volume of sound effects and music. Type can either be <span class="red">"sfx"</span> or <span class="red">"bgm"</span></p> + <p><span class="white">stop(sound)</span> - stops all instances of that sound</p> + </div> + <a name="input"></a> + <h2 class="white">input</h2> + <div class="section"> + <p>The input system is basically some arrays with booleans that correspond to keys or buttons</p> + <p>If there is no <a href="#structure">input function</a>, call input code in the <span class="white">update</span> function</p> + <h3>Keys</h3> + <div class="section"> + <p><span class="white">keyDown</span> - an array of booleans at the position of their corresponding key code. True when their key is held down.</p> + <p>To access a specific key, access the array at position [key code]</p> + <p>Up arrow key example: <span class="red">if( keyDown[ 38 ] ) { //code }</span></p> + <p><span class="white">keyPress</span> - same as keyDown, but only true the first frame a key is pressed</p> + <p><span class="white">k</span> - an object with key codes</p> + <p>Same example as above, but using k: <span class="red">if( keyDown[ k.UP ] ) { //code }</span></p> + <p>To see the full list that k has, enter k in the console or see the list here: a-z, 0-9, F1-F12, BACKTICK, MINUS, EQUALS, OPENSQUARE, ENDSQUARE, SEMICOLON, SINGLEQUOTE, BACKSLASH, COMMA, PERIOD, SLASH, ENTER, BACKSPACE, TAB, CAPSLOCK, SHIFT, CONTROL, ALT, META, LEFTBACKSLASH, ESCAPE, HOME, END, PAGEUP, PAGEDOWN, DELETE, INSERT, PAUSE, UP, DOWN, LEFT, RIGHT, CONTEXT, SPACE</p> + </div> + <h3>Mouse</h3> + <div class="section"> + <p><span class="white">mouseDown</span> - an array of booleans corresponding to mouse buttons. True when a mouse button is held down. To access a specific button, access the array at position [button code]</p> + <p><span class="white">mousePress</span> - same as mouseDown, but only true the first frame a button is pressed</p> + <p><span class="white">mouse buttons</span> - 0 = LMB, 1 = middle click, 2 = RMB</p> + <p>left click example: <span class="red">if( mousePress[ 0 ] ) { //code }</span></p> + <p><span class="white">scroll</span> - variable whose value is the scroll amount. One tick of a normal scroll wheel is 1 or -1, but things like laptop touchpads might return partial numbers.</p> + <p><span class="white">mousePosition()</span> - returns a point representing where the mouse is in the game.</p> + <p><span class="white">mousePos</span> - an object with an x and y. The mouse position ignoring the camera.</p> + </div> + </div> + <a name="utils"></a> + <h2 class="white">utils</h2> + <div class="section"> + <p><span class="white">rand(minimum, maximum)</span> - returns a random whole number between the minimum and maximum (both inclusive)</p> + <p><span class="white">radToDeg(radians)</span> - pass in an angle in radians, returns the angle in degrees</p> + <p><span class="white">degToRad(degrees)</span> - pass in an angle in degrees, returns the angle in radians</p> + <p><span class="white">pointTo(point, targetPoint)</span> - returns the angle (in radians) something at <span class="white">point</span> needs to be at to point towards <span class="white">targetPoint</span></p> + </div> + </div> + <script> + setInterval(physicsUIUpdate,16); + function physicsUIUpdate() { + var col1 = document.getElementById("col1").value; + var col2 = document.getElementById("col2").value; + + var txtOutput; + + testForMatch(col1 + col2); + testForMatch(col2 + col1); + function testForMatch(str) { + switch(str) { + case "circlecircle": + txtOutput = "circlecircle(circle, circle)"; + break; + case "circlepoint": + txtOutput = "circlepoint(circle, point)"; + break; + case "rectrect": + txtOutput = "rectrect(rect, rect)"; + break; + case "rectpoint": + txtOutput = "rectpoint(rect, point)"; + break; + case "circlerect": + txtOutput = "circlerect(circle, rect)"; + break; + case "pointpoint": + txtOutput = "p1.x == p2.x && p1.y == p2.y"; + break; + } + } + + document.getElementById("txtOut").innerHTML = txtOutput; + } + </script> + </body> +</html> +<span class="white"></span> \ No newline at end of file diff --git a/assets/js/glib/gamejs/game.js b/assets/js/glib/gamejs/game.js new file mode 100644 index 0000000..cd27c8e --- /dev/null +++ b/assets/js/glib/gamejs/game.js @@ -0,0 +1,1057 @@ +function createCanvas(id) { + var tempCanvas = document.createElement("canvas"); + tempCanvas.id = id; + tempCanvas.width = canvases.cvs.width; + tempCanvas.height = canvases.cvs.height; + tempCanvas.style = "image-rendering:pixelated;image-rendering: crisp-edges;display:none";//display:none; + + document.body.appendChild(tempCanvas); + + canvases[`${id}cvs`] = document.getElementById(id); + canvases[`${id}ctx`] = canvases[`${id}cvs`].getContext("2d"); +} + +function startLoops() { + try {draw} catch (err){console.warn(bug+" no draw function found");return null;} + try {update} catch (err){console.warn(bug+" no update function found");return null;} + try {input} catch (err){seperateInputLoop=false;} + try {onAssetsLoaded()} catch (err) {} + + requestAnimationFrame(drawLoop); + setInterval(updateLoop,1000/updateFPS); + + if(seperateInputLoop) { + setInterval(inputLoop,4); + } +} + +function mousePosition() { + if(drawMode===0) { + return {x:(mousePos.x)-camera.x,y:(mousePos.y)-camera.y}; + } else if(drawMode===1) { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + return {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + } else { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + var tempPos = {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + + var center = {x:-camera.x + cw/2, y:-camera.y + ch/2}; + var tempAngle = pointTo(center,tempPos) - camera.angle; + var tempDist = dist(center,tempPos); + + return {x:center.x + (Math.cos(tempAngle) * tempDist),y:center.y + (Math.sin(tempAngle) * tempDist)} + } +} + +function addStyle() { + var tempStyle = document.createElement("style"); + tempStyle.id="gamejsstyle"; + document.head.appendChild(tempStyle); + var tempMeta = document.createElement("meta"); + tempMeta.setAttribute("charset","utf-8"); + document.head.appendChild(tempMeta); +} + +function rand(min,max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function radToDeg(rad) {return rad / Math.PI * 180;} +function degToRad(deg) {return deg * Math.PI / 180;} + +function velocity(angle) { + return {x:Math.sin(angle),y:Math.cos(angle)}; +} + +function pointTo(point,targetPoint) { + var adjacent = (targetPoint.x - point.x); + var opposite = (targetPoint.y - point.y); + var h = Math.atan2(opposite, adjacent); + return h; +} + +function loadImagesAndSounds() { + var curpath=""; + context = new AudioContext(); + sfxVolumeNode = context.createGain(); + sfxVolumeNode.connect(context.destination); + bmgVolumeNode = context.createGain(); + bmgVolumeNode.connect(context.destination); + deeper(images,"image"); + deeper(audio,"sound"); + function deeper(curpos,type) { + let addedPath=""; + for(let j=0;j<curpos.length;j++) { + if(typeof curpos[j]=="string") { + if(j==0) { + curpath+=curpos[j]; + addedPath = curpos[j]; + } else { + if(type=="image") { + let name = curpath + curpos[j]; + imagePaths.push(name); + let temp = new Image(); + temp.src = name; + temp.onerror = function () { + console.warn(bug+" "+this.src + " was not found"); + }; + temp.onload = function() {spriteLoad(name,temp);} + imgs.push(temp); + } else if(type=="sound") { + audioPaths.push(curpath + curpos[j]); + newSound(curpath + curpos[j]); + } + } + } + if(typeof curpos[j]=="object") { + deeper(curpos[j],type); + } + } + curpath = curpath.slice(0,curpath.length-addedPath.length); + } + + loadingCircle = new Image(); + loadingCircle.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAf0lEQVQ4jc2SuxHAIAxDbY4pMpHmyJSeKGuQKpyj2Hy6qETPQvhQCWRmDRfeZ4cJAGW28mAUyL4Pqmx2nfK+zaR59glRHo5qZi0BaPHmbDhiyuzdsza9wcrtEVtG4Ip+FLCzTM+WneWxPv9gpQUzmhncLPOHUCYfHr4/C4r2dQPfhkeIbjeYWgAAAABJRU5ErkJggg=="; + clickSound = new Audio("data:audio/x-wav;base64,UklGRowBAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YWgBAADa/6T/2/+S/x//pP769Xr4fPh5+H34evh7+Pv6gf18/QIAhQcIDxUZFR4VHhgeEx6TFgkPCgqAAnz49/X18HLu7ubo4eXc5dzj3Gjf5+Fr5G7pce759YECiwwRFBQZlxuXG5cbFRmTFo8RCAoAAPz69/X08G7udO5s7vz1dvj++nv9gP3+/wEAgwKBAogHkBEpLUNG1lzqcPV683r4eu51ZmnVV7w+qypy88fDoKAXlAqKBoUAgIeHlpYsrTu87Ot9/ZIRGxkoKDEtqionIxgZiwfj5lnaz9JN0E3QV9pd3+Tm9fUBAAQFBwWNDBEPFxSYFpsWEA9+/fP1dfNt83bz8fX9+gQFkAwPDxQPEQ+IBwIAdfjv8OLm2+HX3Nrh4+bm63n4BAUUDx0ZqyCrJSkelBGEAnb4a+5a5Njcztxc31jkZunx9QgFGhQfGa0gqCCuIKkgpRsaFIsHdfhj6dfh0NzM19Th6es="); + let pos = {x:cw/2-100,y:ch/2-100}; + optionsButtons.screenSize = {x:pos.x+160,y:pos.y+12,w:50,h:20}; + optionsButtons.sfx = {x:pos.x+125,y:pos.y+40,w:120,h:20}; + optionsButtons.bmg = {x:pos.x+125,y:pos.y+70,w:120,h:20}; + loadLoop(); +} + +function loadLoop() { + if(Object.keys(sprites).length == imagePaths.length && audioPaths.length == audioLoadedLength) { + startLoops(); + imagePaths=[]; + audioPaths=[]; + imgs=[]; + } else { + curCtx.fillStyle="#2d2d2d"; + curCtx.fillRect(0,0,cw,ch); + text(`audio: ${audioLoadedLength}/${audioPaths.length}`,10,30,"white",2); + text(`sprites: ${Object.keys(sprites).length}/${imagePaths.length}`,10,10,"white",2); + curCtx.setTransform(1, 0, 0, 1, Math.round(cw/2), Math.round(ch/2)); + curCtx.rotate(loadAng); + loadAng+=0.1; + curCtx.drawImage(loadingCircle,Math.round(-8),Math.round(-8)); + curCtx.setTransform(1, 0, 0, 1, 0, 0); + requestAnimationFrame(loadLoop); + } +} + +function spriteLoad(path,image) { + let startpos; + let endpos = path.lastIndexOf("."); + for(let j=endpos-1;acceptableChars.includes(path[j]);j--) {startpos=j;} + let spriteName = path.slice(startpos,endpos) + let dsize=Math.max(image.width,image.height)/2; + sprites[spriteName] = {spr:image,drawLimitSize:dsize}; + +} + +function newSound(src) { + let startpos; + let endpos = src.lastIndexOf("."); + for(let j=endpos-1;acceptableChars.includes(src[j]);j--) {startpos=j;} + let soundName = src.slice(startpos,endpos); + sounds[soundName] = {nodes:[],volNodes:[],src:src,type:"sfx",volume:1}; + sounds[soundName].nodes = [1]; + + let loadingSound = new Audio(); + loadingSound.onerror = function () { + console.warn(bug+" "+ src + " was not found"); + }; + loadingSound.src = src; + loadingSound.preload='auto'; + loadingSound.addEventListener('canplaythrough', function() { + audioLoadedLength++; + }, false); + sounds[soundName].nodes.push(loadingSound); + + let soundNode = context.createMediaElementSource(loadingSound); + let gainNode = context.createGain(); + + soundNode.connect(gainNode); + gainNode.connect(sfxVolumeNode); + + abuffer.push(soundNode); + volumeList.push(gainNode); + sounds[soundName].volNodes.push(volumeList.length-1); +} + +function addSound(sound) { + let loadingSound = new Audio(); + loadingSound.src = sound.src; + loadingSound.preload='auto'; + sound.nodes.splice(sound.nodes[0],0,loadingSound); + + let soundNode = context.createMediaElementSource(loadingSound); + let gainNode = context.createGain(); + gainNode.gain.value=sound.volume; + + soundNode.connect(gainNode); + gainNode.connect(sound.type=="sfx"?sfxVolumeNode:bmgVolumeNode); + + abuffer.push(soundNode); + volumeList.push(gainNode); + sound.volNodes.push(volumeList.length-1); +} + + + +function play(sound) { + s=sound.nodes; + if(s[s[0]].ended || !(s[s[0]].played.length)) { + s[s[0]].play(); + s[0]++; + if(s[0]==s.length) { + s[0]=1; + } + } else { + addSound(sound); + s[s[0]].play(); + s[0]++; + if(s[0]==s.length) { + s[0]=1; + } + } +} + +function setVolume(sound,volume) { + for(let i=0,l=sound.volNodes.length;i<l;i++) { + volumeList[sound.volNodes[i]].gain.value = volume; + } +} + +function setType(sound,newType) { + for(let i=0,l=sound.volNodes.length;i<l;i++) { + volumeList[sound.volNodes[i]].disconnect(sound.type=="sfx"?sfxVolumeNode:bmgVolumeNode); + volumeList[sound.volNodes[i]].connect(newType=="sfx"?sfxVolumeNode:bmgVolumeNode); + } + sound.type = newType; +} + +function stop(sound) { + s=sound.nodes; + for(let i=1;i<s.length;i++) { + s[i].pause(); + s[i].currentTime = 123456789; // this will not end the sound if it is longer than 3.9 years + } +} + +function handleOptionsInput() { + let ImTierdMakemenuwork=true; + if(optionsMenu) { + if(mousePress[0]) { + if(rectpoint(optionsButtons.screenSize,mousePos)) { + if(screenSize=="1:1") { + screenSize = "fit"; + canvasScale=0; + } else { + screenSize = "1:1"; + canvasScale=1; + } + } + if(!rectpoint({x:cw/2,y:ch/2,w:200,h:200},mousePos)) { + optionsMenu=false; + ImTierdMakemenuwork=false; + } + } + if(mouseDown[0]) { + if(rectpoint(optionsButtons.sfx,mousePos)) { + volume.sfx = (mousePos.x-(optionsButtons.sfx.x-60))/120; + } + if(rectpoint(optionsButtons.bmg,mousePos)) { + volume.bgm = (mousePos.x-(optionsButtons.bmg.x-60))/120; + } + } + } + if(mousePos.x>cw-32&&mousePos.y<32) { + if(mousePress[0]&&ImTierdMakemenuwork) { + clickSound.play(); + paused=true; + optionsMenu=!optionsMenu; + } + optionsHover = 25; + } else { + optionsHover = 0; + } + if(mousePos.x<cw-32&&mousePos.x>cw-64&&mousePos.y<32) { + pauseHover = 25; + if(mousePress[0]) { + clickSound.play(); + paused=!paused; + } + } else { + pauseHover = 0; + } + +} +function addFont() { + var tempStyle = document.createElement("style"); + tempStyle.innerHTML = ` + @font-face { + font-family: 'PixelArial11'; + src: url(data:font/truetype;charset=utf-8;base64,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) format('truetype'); + font-weight: 900; + font-style: normal; + + } + html {font-family: 'PixelArial11' !important; font-size: 16px;} + `; + document.head.appendChild(tempStyle); + canvases.ctx.textBaseline = "hanging"; + canvases.ctx.textAlign = "left"; +} +function img(img,x,y,angle=0,sx=1,sy=1) { + var half = img.drawLimitSize; + if((x+half>drawLimitLeft&&x-half<drawLimitRight&&y+half>drawLimitTop&&y-half<drawLimitBottom)||absDraw) { + var spr = img.spr; + if(angle===0&&sx===1&&sy===1) { + curCtx.drawImage(spr,Math.round(x+camera.x+difx-(spr.width/2)),Math.round(y+camera.y+dify-(spr.height/2))); + } else { + curCtx.setTransform(sx, 0, 0, sy, Math.round(x+camera.x+difx), Math.round(y+camera.y+dify)); + curCtx.rotate(angle); + curCtx.drawImage(spr,Math.round(-spr.width/2),Math.round(-spr.height/2)); + curCtx.setTransform(1, 0, 0, 1, 0, 0); + } + } +} + +function imgIgnoreCutoff(img,x,y,angle=0,sx=1,sy=1) { + var spr = img.spr; + if(angle===0&&sx===1&&sy===1) { + curCtx.drawImage(spr,Math.round(x+camera.x+difx-(spr.width/2)),Math.round(y+camera.y+dify-(spr.height/2))); + } else { + curCtx.setTransform(sx, 0, 0, sy, Math.round(x+camera.x+difx), Math.round(y+camera.y+dify)); + curCtx.rotate(angle); + curCtx.drawImage(spr,Math.round(-spr.width/2),Math.round(-spr.height/2)); + curCtx.setTransform(1, 0, 0, 1, 0, 0); + } +} + +function rect(x,y,w,h,color) { + curCtx.fillStyle = color; + curCtx.fillRect(x-(w/2)+camera.x+difx,y-(h/2)+camera.y+dify,w,h); +} + +function circle(x,y,r,color) { + curCtx.beginPath(); + curCtx.arc(x+camera.x+difx, y+camera.y+dify, r, 0, 2 * Math.PI, false); + curCtx.fillStyle = color; + curCtx.fill(); +} + +function shape(x,y,relitivePoints,color) { + x+=camera.x+difx; + y+=camera.y+dify; + curCtx.fillStyle = color; + curCtx.beginPath(); + curCtx.moveTo(x+relitivePoints[0].x, y+relitivePoints[0].y); + for(let i=1,l=relitivePoints.length;i<l;i++) { + curCtx.lineTo(x+relitivePoints[i].x, y+relitivePoints[i].y); + } + curCtx.fill(); +} + +function text(txt,x,y,color="black",size=1,maxWidth=cw) { + txt = txt.toString(); + curCtx.fillStyle = color; + curCtx.font = `${Math.round(size)*8}px PixelArial11`; + //I hate text wrapping now + var txtList = txt.split("\n"); //split string on enters + for(let i=0;i<txtList.length;i++) { //go through array of strings + if(curCtx.measureText(txtList[i]).width>maxWidth) { //if the string is too big, divide up into smaller strings + var tempTxt = txtList[i].split(" "); //split into individual words + var tempStr=""; //string for measuring size + var addAmount=0; //track where in the txtList we are + txtList.splice(i,1); //remove the too long string + for(let j=0;j<tempTxt.length;j++) { //go through the split up string + if(curCtx.measureText(tempStr + tempTxt[j] + " ").width<maxWidth) { //if adding a word doesn't make tempStr too long, add it, other wise, add tempStr to txtList; + tempStr += tempTxt[j] + " "; + } else { + if(j==0) {tempStr+=tempTxt[j];} //if we are here when j is 0, we have one word that is longer then the maxWidth, so we just draw it + txtList.splice(i+addAmount,0,tempStr); //put tempStr in txtList + addAmount++; //move the position we put the tempStr in + tempStr=""; //reset tempStr + tempTxt.splice(0,(j==0?1:j)); //delete words that have been used + j=-1; //make it so in the next loop, j starts at 0 + } + } + if(tempStr.length!=0) { + txtList.splice(i+addAmount,0,tempStr); //add any leftover text + } + } + } + + for(let i=0;i<txtList.length;i++) { + curCtx.fillText(txtList[i],x+camera.x+difx,y+camera.y+dify+((i+(drawMode?1:0))*8*size+(size*i))); + } +} + +function textWidth(txt,size=1) { + txt = txt.toString(); + curCtx.font = `${Math.round(size)*8}px PixelArial11`; + return curCtx.measureText(txt).width; +} + +function centerCameraOn(x,y) { + camera.x = -x+canvases.cvs.width/2; + camera.y = -y+canvases.cvs.height/2; +} + +function moveCamera(x,y) { + camera.x -= y * Math.sin(camera.angle); + camera.y -= y * Math.cos(camera.angle); + camera.x -= x * Math.sin(camera.angle + 1.57079632); + camera.y -= x * Math.cos(camera.angle + 1.57079632); +} + +function imgRotScale(x,y,angle,scale,pic,ctx) { //used for camera movement + ctx.setTransform(scale, 0, 0, scale, x, y); + ctx.rotate(angle); + ctx.drawImage(pic,-pic.width/2,-pic.height/2); + ctx.setTransform(1, 0, 0, 1, 0, 0); +} + +function drawCursor() { + if(cursor.sprite&&mouseOnCanvas) { + if(cursor.alignment) { + canvases.ctx.drawImage(cursor.sprite,mousePos.x-Math.round(cursor.sprite.width/2),mousePos.y-Math.round(cursor.sprite.height/2)); + } else { + canvases.ctx.drawImage(cursor.sprite,mousePos.x,mousePos.y); + } + cursor.show = false; + } else { + cursor.show = true; + } +} + +function render() { + if(drawMode===1) { + imgRotScale(canvases.cvs.width/2,canvases.cvs.height/2,0,camera.zoom,canvases.buffer1cvs,canvases.ctx); + } + if(drawMode===2) { + imgRotScale(canvases.cvs.width/2,canvases.cvs.height/2,camera.angle,1,canvases.buffer2cvs,canvases.buffer1ctx); + imgRotScale(canvases.cvs.width/2,canvases.cvs.height/2,0,camera.zoom,canvases.buffer1cvs,canvases.ctx); + } +} + +function clearCanvases() { + canvases.ctx.clearRect(0,0,canvases.cvs.width,canvases.cvs.height); + canvases.buffer1ctx.clearRect(0,0,canvases.buffer1cvs.width,canvases.buffer1cvs.height); + canvases.buffer2ctx.clearRect(0,0,canvases.buffer2cvs.width,canvases.buffer2cvs.height); +} + +function switchDrawMode() { + if(camera.zoom<1) {camera.zoom=1;} + if(camera.angle!=0) { + drawMode=2; + } else if(camera.zoom!=1) { + drawMode=1; + } else { + drawMode=0; + } + switch (drawMode) { + case 0: curCtx = canvases.ctx; break; + case 1: curCtx = canvases.buffer1ctx; break; + case 2: curCtx = canvases.buffer2ctx; break; + } +} + +function resizeBuffers() { + var tempSize = maxCvsSize/camera.zoom; + var tempSizeAndPadding = tempSize + (tempSize/2) + + canvases.buffer2cvs.width = tempSizeAndPadding; + canvases.buffer2cvs.height = tempSizeAndPadding; + + if(drawMode===2) { + difx = (canvases.buffer2cvs.width - canvases.cvs.width)/2; + dify = (canvases.buffer2cvs.height - canvases.cvs.height)/2; + } else { + difx=0; + dify=0; + } + canvases.buffer2ctx.imageSmoothingEnabled = false; +} + +function scaleCanvases() { //scales canvas by canvas scale, if scale is 0, canvas will try to fit screen + var style = document.getElementById("gamejsstyle"); + if(canvasScale==0) { + var tempScale = Math.min(Math.floor(window.innerWidth/canvases.cvs.width),Math.floor(window.innerHeight/canvases.cvs.height)); + tempScale=tempScale<1?1:tempScale; + autoScale=tempScale; + style.innerHTML = `#game {image-rendering:pixelated;image-rendering: crisp-edges;width:${tempScale*canvases.cvs.width}px;cursor: ${cursor.show?"crosshair":"none"};}`; + } else { + style.innerHTML = `#game {image-rendering:pixelated;image-rendering: crisp-edges;width:${Math.floor(canvasScale*canvases.cvs.width)}px;cursor: ${cursor.show?"crosshair":"none"};}`; + } +} + +function drawButtons() { + let pos = {x:cw-16,y:16}; + //options + rect(pos.x,pos.y,34,34,"#9c9c9c"); + let c = optionsHover+45; + rect(pos.x,pos.y,32,32,`rgb(${c},${c},${c})`); + c = optionsHover + 69; + let cc = `rgb(${c},${c},${c})`; + rect(pos.x,pos.y-6,26,4,cc); + rect(pos.x-6,pos.y-6,4,8,cc); + rect(pos.x,pos.y+6,26,4,cc); + rect(pos.x+11,pos.y+6,4,8,cc); + //pause + pos.x-=33; + rect(pos.x,pos.y,34,34,"#9c9c9c"); + c = pauseHover+45; + rect(pos.x,pos.y,32,32,`rgb(${c},${c},${c})`); + c = pauseHover + 69; + cc = `rgb(${c},${c},${c})`; + if(paused) { + shape(pos.x,pos.y,[{x:-7,y:-10},{x:-7,y:10},{x:10,y:0}],cc); + } else { + rect(pos.x+6,pos.y,6,20,cc); + rect(pos.x-6,pos.y,6,20,cc); + } +} + +function drawOptionsMenu() { + if(optionsMenu) { + let pos = {x:cw/2-100,y:ch/2-100}; + rect(cw/2,ch/2,200,200,"#242424"); + text("Screen Size:",pos.x+2,pos.y+2,"white",2); + let b = optionsButtons.screenSize; + rect(b.x,b.y,b.w,b.h,"#444444"); + text(screenSize,pos.x+145,pos.y+4,"white",2); + text("sfx",pos.x+2,pos.y+30,"white",2); + b = optionsButtons.sfx; + rect(b.x,b.y,b.w,b.h-10,"#444444"); + rect((b.x-60)+(volume.sfx*120),b.y,8,20,"#444444"); + text("bgm",pos.x+2,pos.y+60,"white",2); + b = optionsButtons.bmg; + rect(b.x,b.y,b.w,b.h-10,"#444444"); + rect((b.x-60)+(volume.bgm*120),b.y,8,20,"#444444"); + } +} +var k={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,BACKTICK:192,MINUS:189,EQUALS:187,OPENSQUARE:219,ENDSQUARE:221,SEMICOLON:186,SINGLEQUOTE:222,BACKSLASH:220,COMMA:188,PERIOD:190,SLASH:191,ENTER:13,BACKSPACE:8,TAB:9,CAPSLOCK:20,SHIFT:16,CONTROL:17,ALT:18,META:91,LEFTBACKSLASH:226,ESCAPE:27,HOME:36,END:35,PAGEUP:33,PAGEDOWN:34,DELETE:46,INSERT:45,PAUSE:19,UP:38,DOWN:40,LEFT:37,RIGHT:39,CONTEXT:93,SPACE:32,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123}; +var keyPress = []; +var keyDown = []; +var mousePress = []; +var mouseDown = []; +var scroll = 0; +var mousePos = { + x:0, + y:0 +} +var preventedEvents = [false,true,true]; + +function addListenersTo(elementToListenTo) { + window.addEventListener("keydown",kdown); + window.addEventListener("keyup",kup); + elementToListenTo.addEventListener("mousedown",mdown); + elementToListenTo.addEventListener("mouseup",mup); + elementToListenTo.addEventListener("mousemove",mmove); + elementToListenTo.addEventListener("contextmenu",cmenu); + elementToListenTo.addEventListener("wheel",scrl); +} +function removeListenersFrom(elementToListenTo) { + window.removeEventListener("keydown",kdown); + window.removeEventListener("keyup",kup); + elementToListenTo.removeEventListener("mousedown",mdown); + elementToListenTo.removeEventListener("mouseup",mup); + elementToListenTo.removeEventListener("mousemove",mmove); + elementToListenTo.removeEventListener("contextmenu",cmenu); + elementToListenTo.removeEventListener("wheel",scrl); +} +function resetInput() { + for(var i=0;i<keyPress.length;i++){if(keyPress[i]){keyPress[i]=0}} + for(var i=0;i<mousePress.length;i++){if(mousePress[i]){mousePress[i]=0}} + scroll=0; +} +function kdown(e) { + var h=e.keyCode; + keyPress[h]=keyPress[h]==[][[]]?1:0; + keyDown[h]=1; + if(preventedEvents[0]) {e.preventDefault()} +} +function kup(e) { + var h=e.keyCode; + delete keyPress[h]; + delete keyDown[h]; +} +function mdown(e) { + var h=e.button; + mousePress[h]=mousePress[h]==[][[]]?1:0; + mouseDown[h]=1; + if(preventedEvents[1]) {e.preventDefault()} +} +function mup(e) { + var h=e.button; + delete mousePress[h]; + delete mouseDown[h]; +} +function mmove(e) { + mousePos.x=e.offsetX/(!canvasScale?autoScale:canvasScale); + mousePos.y=e.offsetY/(!canvasScale?autoScale:canvasScale); +} +function cmenu(e) { + if(preventedEvents[1]) {e.preventDefault()} +} +function scrl(e) { + scroll+=-1*(e.deltaY/100); + if(preventedEvents[2]) {e.preventDefault()} +} +function dist(point1,point2) { + let one = (point2.x - point1.x); + let two = (point2.y - point1.y); + return Math.sqrt((one*one)+(two*two)); +} + +function circlecircle(circle1,circle2) { + if( dist(circle1,circle2) < (circle1.r + circle2.r)) { + return true; + } else { + return false; + } +} + +function circlepoint(circle,point) { + if( dist(circle,point) < circle.r) { + return true; + } else { + return false; + } +} + +function rectrect(rect1,rect2) { + if(rect1.x + rect1.w/2 >= rect2.x - rect2.w/2 && + rect1.x - rect1.w/2 <= rect2.x + rect2.w/2 && + rect1.y + rect1.h/2 >= rect2.y - rect2.h/2 && + rect1.y - rect1.h/2 <= rect2.y + rect2.h/2) { + return true; + } else { + return false; + } +} + +function rectpoint(rect,point) { + if(rect.x + rect.w/2 >= point.x && + rect.x - rect.w/2 <= point.x && + rect.y + rect.h/2 >= point.y && + rect.y - rect.h/2 <= point.y ) { + return true; + } else { + return false; + } +} + +function circlerect(circle,rect) { //credit: https://yal.cc/rectangle-circle-intersection-test/ + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let deltaX = circle.x - Math.max(rect.x - rectHalfWidth, Math.min(circle.x, rect.x + rectHalfWidth)); + let deltaY = circle.y - Math.max(rect.y - rectHalfHeight, Math.min(circle.y, rect.y + rectHalfHeight)); + return (deltaX * deltaX + deltaY * deltaY) < (circle.r * circle.r); +} + +function circleOnSideRect(circle,rect) { + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let left = rect.x - rectHalfWidth; + let right = rect.x + rectHalfWidth; + let top = rect.y - rectHalfHeight; + let bottom = rect.y + rectHalfHeight; + let cx = circle.x; + let cy = circle.y; + if(cy < top && cx > left && cx < right) { // top side + return 0; + } else if(cy > bottom && cx > left && cx < right) { // bottom side + return 2; + } else if (cx < left && cy > top && cy < bottom) { // left side + return 3; + } else if (cx > right && cy > top && cy < bottom) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let topleft = dist (circle,{x:left,y:top}); + let topright = dist (circle,{x:right,y:top}); + let bottomleft = dist (circle,{x:left,y:bottom}); + let bottomright = dist (circle,{x:right,y:bottom}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the cricle is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect,{x:left,y:top}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 3;} else {returnValue = 0;} + break; + case topright: + var m = slope(rect,{x:right,y:top}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 0;} else {returnValue = 1;} + break; + case bottomleft: + var m = slope(rect,{x:left,y:bottom}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 3;} else {returnValue = 2;} + break; + case bottomright: + var m = slope(rect,{x:right,y:bottom}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 2;} else {returnValue = 1;} + break; + } + return returnValue; + } +} + +function rectOnSideRect(rect1,rect2) { + let rectHalfWidth2 = rect2.w/2; + let rectHalfHeight2 = rect2.h/2; + let left2 = rect2.x - rectHalfWidth2; + let right2 = rect2.x + rectHalfWidth2; + let top2 = rect2.y - rectHalfHeight2; + let bottom2 = rect2.y + rectHalfHeight2; + + let rectHalfWidth1 = rect1.w/2; + let rectHalfHeight1 = rect1.h/2; + let rx1 = rect1.x; + let ry1 = rect1.y; + let left1 = rx1 - rectHalfWidth1; + let right1 = rx1 + rectHalfWidth1; + let top1 = ry1 - rectHalfHeight1; + let bottom1 = ry1 + rectHalfHeight1; + // find what point is closer to the rectangle + let topleft1 = dist (rect2,{x:left1,y:top1}); + let topright1 = dist (rect2,{x:right1,y:top1}); + let bottomleft1 = dist (rect2,{x:left1,y:bottom1}); + let bottomright1 = dist (rect2,{x:right1,y:bottom1}); + let topmiddle1 = dist (rect2,{x:rx1,y:top1}); + let rightmiddle1 = dist (rect2,{x:right1,y:ry1}); + let bottommiddle1 = dist (rect2,{x:rx1,y:bottom1}); + let leftmiddle1 = dist (rect2,{x:left1,y:ry1}); + let cx = rx1; + let cy = ry1; + switch(Math.min(topleft1,topright1,bottomleft1,bottomright1,topmiddle1,rightmiddle1,bottommiddle1,leftmiddle1)) { + //set the point we are testing to the closest point to the rectangle + case topleft1: + cx -= rect1.w/2; + cy -= rect1.h/2; + break; + case topright1: + cx += rect1.w/2; + cy -= rect1.h/2; + break; + case bottomleft1: + cx -= rect1.w/2; + cy += rect1.h/2; + break; + case bottomright1: + cx += rect1.w/2; + cy += rect1.h/2; + break; + case topmiddle1: + cy -= rect1.h/2; + break; + case rightmiddle1: + cx += rect1.w/2; + break; + case bottommiddle1: + cy += rect1.h/2; + break; + case leftmiddle1: + cx -= rect1.w/2; + break; + } + if(cy < top2 && cx > left2 && cx < right2) { // top side + return 0; + } else if(cy > bottom2 && cx > left2 && cx < right2) { // bottom side + return 2; + } else if (cx < left2 && cy > top2 && cy < bottom2) { // left side + return 3; + } else if (cx > right2 && cy > top2 && cy < bottom2) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let determiningPoint = {x:cx,y:cy}; + let topleft = dist (determiningPoint,{x:left2,y:top2}); + let topright = dist (determiningPoint,{x:right2,y:top2}); + let bottomleft = dist (determiningPoint,{x:left2,y:bottom2}); + let bottomright = dist (determiningPoint,{x:right2,y:bottom2}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the point is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect2,{x:left2,y:top2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 3;} else {returnValue = 0;} + break; + case topright: + var m = slope(rect2,{x:right2,y:top2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 0;} else {returnValue = 1;} + break; + case bottomleft: + var m = slope(rect2,{x:left2,y:bottom2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 3;} else {returnValue = 2;} + break; + case bottomright: + var m = slope(rect2,{x:right2,y:bottom2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx<mid) {returnValue = 2;} else {returnValue = 1;} + break; + } + return returnValue; + } +} + +function slope(point1,point2) { + return ((point2.y-point1.y)/(point2.x-point1.x)); +} + +function yIntercept(point,slope) { + return point.y - (slope * point.x); +} + +function POI(m1,b1,m2,b2) { + x = (b2 - b1) / (m1 - m2); + return x; + //y = m1 * x + b1; +} + +function ifRectOnEdgeBounce(rect) { + let rx = rect.x; + let ry = rect.y; + let rw = rect.w/2; + let rh = rect.h/2; + if(rx+rw>edge.right) { + rect.v.x *= -1; + rect.x = edge.right-rw; + } + if(rx-rw<edge.left) { + rect.v.x *= -1; + rect.x = edge.left+rw; + } + if(ry+rh>edge.bottom) { + rect.v.y *= -1; + rect.y = edge.bottom-rh; + } + if(ry-rh<edge.top) { + rect.v.y *= -1; + rect.y = edge.top+rh; + } +} + +function ifCircleOnEdgeBounce(circle) { + let cx = circle.x; + let cy = circle.y; + let cr = circle.r; + if(cx+cr>edge.right) { + circle.v.x *= -1; + circle.x = edge.right-cr; + } + if(cx-cr<edge.left) { + circle.v.x *= -1; + circle.x = edge.left+cr; + } + if(cy+cr>edge.bottom) { + circle.v.y *= -1; + circle.y = edge.bottom-cr; + } + if(cy-cr<edge.top) { + circle.v.y *= -1; + circle.y = edge.top+cr; + } +} +// create globals +var canvases={cvs:null,ctx:null,buffer1cvs:null,buffer1ctx:null,buffer2cvs:null,buffer2ctx:null}, // visable and hidden canvases +cw, // canvas width +ch, // canvas height +camera={zoom:1,angle:0,x:0,y:0}, // affects how everything is drawn +updateFPS=60, +gameStarted=false, +drawMode=0, // 0=normal, 1=zoomed, 2=zoomed/rotated, set automatically depending on camera +absDraw=false, +curCtx, // what canvas to draw to +maxCvsSize, // used by second buffer +canvasScale=1, +difx=0, // offsets for drawing +dify=0, +seperateInputLoop=true, +edge={top:null,bottom:null,left:null,right:null}, // used by if___OnEdgeBounce, set to canvas size at setup, can be changed whenever +drawLimitLeft, +drawLimitRight, +drawLimitTop, +drawLimitBottom, +sizeDif, +bug="\uD83D\uDC1B", +loadingCircle, +loadAng=0, +optionsHover=0, +pauseHover=0, +optionsMenu=false, +optionsButtons={}, +clickSound, +paused=false, +screenSize="1:1", +autoScale=1, + +images=[], // put image paths here +imagePaths=[], +imgs=[], +sprites={}, // loaded images + +audio=[], // put audio paths here +audioPaths=[], +sounds={}, // loaded sounds +abuffer = [], // audio nodes shoved here +volumeList = [], // gain nodes shoved here +audioLoadedLength=0, +volume={sfx:1,bgm:1}; +/* options + future: + modefileable checklist + key bindings +*/ + +cursor = {sprite:null,alignment:1,show:true}, // 0=topleft, 1=centered +mouseOnCanvas=false; + +const acceptableChars="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-. ";//for image names + +const AudioContext = window.AudioContext||window.webkitAudioContext; +var context; +var sfxVolumeNode; +var bmgVolumeNode; + +document.getElementById("game").onmouseout = function() {mouseOnCanvas = false;} +document.getElementById("game").onmouseover = function() {mouseOnCanvas = true;} + +//setup canvases and input +function setup(physicsFPS) { + updateFPS = physicsFPS; + + canvases.cvs = document.getElementById("game"); + canvases.ctx = canvases.cvs.getContext("2d", { alpha: false }); + + canvases.cvs.onmousedown = function () {if(!gameStarted){loadImagesAndSounds();gameStarted=true;}} + + createCanvas("buffer1"); + createCanvas("buffer2"); + + canvases.ctx.imageSmoothingEnabled = false; + canvases.buffer1ctx.imageSmoothingEnabled = false; + canvases.buffer2ctx.imageSmoothingEnabled = false; + + maxCvsSize=Math.max(canvases.cvs.width,canvases.cvs.height); + sizeDif=maxCvsSize-Math.min(canvases.cvs.width,canvases.cvs.height); + cw=canvases.cvs.width; + ch=canvases.cvs.height; + + edge={top:0,bottom:ch,left:0,right:cw}; + + addFont(); + addStyle(); + + addListenersTo(canvases.cvs); + + curCtx = canvases.ctx; + requestAnimationFrame(startButton); + function startButton() { + curCtx.fillStyle="#2d2d2d"; + curCtx.fillRect(0,0,cw,ch);//debugger; + circle(cw/2,ch/2,27,"#066312"); + circle(cw/2,ch/2,23,"#149124"); + shape(cw/2,ch/2,[{x:-7,y:-15},{x:-7,y:15},{x:15,y:0}],"#47f55d"); + if(!gameStarted) {requestAnimationFrame(startButton);} + } +} + +function drawLoop() { + cw=canvases.cvs.width; + ch=canvases.cvs.height; + scaleCanvases(); + + switchDrawMode(); + + resizeBuffers(); + + clearCanvases(); + + var limitModifyer = 0; + if(drawMode==2) {limitModifyer=canvases.buffer2cvs.width-maxCvsSize;} + drawLimitLeft = -camera.x - (drawMode==2?sizeDif:0) - limitModifyer; + drawLimitRight = -camera.x + maxCvsSize + (drawMode==2?sizeDif:0) + limitModifyer; + drawLimitTop = -camera.y -(drawMode==2?sizeDif:0) - limitModifyer; + drawLimitBottom = -camera.y + maxCvsSize + (drawMode==2?sizeDif:0) + limitModifyer; + + draw(); + + render(); + + curCtx=canvases.ctx; + difx=0;dify=0; + var camCache = {x:camera.x,y:camera.y}; + camera.x=0;camera.y=0; + drawMode=0; + absDraw=true; + try{absoluteDraw();} catch (err){} + absDraw=false; + + drawButtons(); + drawOptionsMenu(); + drawCursor(); + + camera.x = camCache.x; + camera.y = camCache.y; + + requestAnimationFrame(drawLoop); +} + +function updateLoop() { + if(seperateInputLoop==false) { + handleOptionsInput(); + } + sfxVolumeNode = volume.sfx; + bmgVolumeNode = volume.bmg; + if(!paused) { + update(); + } + + if(seperateInputLoop==false) { + resetInput(); + } +} + + +function inputLoop() { + handleOptionsInput(); + if(!paused) { + input(); + } + + resetInput(); +} \ No newline at end of file diff --git a/assets/js/glib/main.js b/assets/js/glib/main.js new file mode 100644 index 0000000..c9cc09d --- /dev/null +++ b/assets/js/glib/main.js @@ -0,0 +1,5 @@ +/** + * ewpratten's javascript graphics tool + */ + + \ No newline at end of file