From 7e738b951b7a81982ea1c8460a039fe53125ef46 Mon Sep 17 00:00:00 2001 From: MangaValk Date: Sun, 18 Oct 2026 19:26:20 +0200 Subject: [PATCH] Include imported Still Alive data with disclaimer Commit src/still_alive/imported.h instead of ignoring it. The importer now writes a source reference (SDSkyKlouD/still-alive-web) and a disclaimer (Jonathan Coulton / Valve, personal non-commercial use, not affiliated) at the top of the file; the README carries the same disclaimer. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 3 - README.md | 19 +- src/still_alive/imported.h | 784 ++++++++++++++++++++++++++++++++++++ tools/import_still_alive.py | 15 +- 4 files changed, 810 insertions(+), 11 deletions(-) create mode 100644 src/still_alive/imported.h diff --git a/.gitignore b/.gitignore index 54392d9..71242a5 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,3 @@ $RECYCLE.BIN/ # Editors *.swp *~ - -# Imported still_alive text (tools/import_still_alive.py) -src/still_alive/imported.h diff --git a/README.md b/README.md index b9804f6..5b4fc82 100644 --- a/README.md +++ b/README.md @@ -92,17 +92,26 @@ pio device monitor ## Still Alive demo A recreation of Portal's ending: timed song text typed into a console on the -left, credits scrolling top right, ASCII art bottom right. Without extra data it -plays placeholder text. To import the original text, timing, art and credits from -[SDSkyKlouD/still-alive-web](https://github.com/SDSkyKlouD/still-alive-web): +left, credits scrolling top right, ASCII art bottom right. The text, timing, art +and credits in `src/still_alive/imported.h` come from +[SDSkyKlouD/still-alive-web](https://github.com/SDSkyKlouD/still-alive-web) and can +be regenerated with: ```bash python tools/import_still_alive.py pio run -e still_alive -t upload ``` -This writes `src/still_alive/imported.h`, which is git-ignored. Reset the board and -start the song when the serial log says (7.75 s after reset with the imported data). +Without `imported.h` the demo plays placeholder text. Reset the board and start the +song when the serial log says (7.75 s after reset with the imported data). + +**Disclaimer:** "Still Alive" was written by Jonathan Coulton for Portal (2007). +Portal, its credits and ASCII art are © Valve Corporation (see +[Valve Legal Info](https://store.steampowered.com/legal/)); the web recreation they +are imported from is by [SD SkyKlouD](https://github.com/SDSkyKlouD/still-alive-web). +They are included only for personal, non-commercial use in this hobby project, and +all rights remain with their owners. This project is not affiliated with or +endorsed by Valve. ## Using the driver diff --git a/src/still_alive/imported.h b/src/still_alive/imported.h new file mode 100644 index 0000000..2ae0338 --- /dev/null +++ b/src/still_alive/imported.h @@ -0,0 +1,784 @@ +// Song text, timing, ASCII art and credits from Portal's ending sequence, +// imported from still-alive-web by SD SkyKlouD: +// https://github.com/SDSkyKlouD/still-alive-web +// +// Disclaimer: "Still Alive" was written by Jonathan Coulton for Portal (2007). +// Portal, its credits and ASCII art are (c) Valve Corporation, see +// https://store.steampowered.com/legal/. Included only for personal, +// non-commercial use in this hobby project; all rights remain with their +// owners. This project is not affiliated with or endorsed by Valve. +// +// Generated by tools/import_still_alive.py - do not edit by hand. +#pragma once + +#include "show_data.h" + +static const char* const ART_APERTURE_LINES[] = { + " .,-:;//;:=,", + " . :H@@@MM@M#H/.,+%;,", + " ,/X+ +M@@M@MM%=,-%HMMM@X/,", + " -+@MM; $M@@MH+-,;XMMMM@MMMM@+-", + " ;@M@@M- XM@X;. -+XXXXXHHH@M@M#@/.", + " ,%MM@@MH ,@%= .---=-=:=,.", + " =@#@@@MX ., -%HX$$%%%+;", + " =-./@M@M$ .;@MMMM@MM:", + " X@/ -$MM/ .+MM@@@M$", + ",@M@H: :@: . =X#@@@@-", + ",@@@MMX, . /H- ;@M@M=", + ".H@@@@M@+, %MM+..%#$.", + " /MMMM@MMH/. XM@MH; =;", + " /%+%$XHH@$= , .H@@@@MX,", + " .=--------. -%H.,@@@@@MX,", + " .%MM@@@HHHXX$$$%+- .:$MMX =M@@MM%.", + " =XMMM@MM@MM#H;,-+HMM@M+ /MMMX=", + " =%@M@M#@$-.=$@MM@@@M; %M%=", + " ,:+$+-,/H#MMMMMMM@= =,", + " =++%%%%+/:-.", +}; + +static const char* const ART_CAKE_LINES[] = { + " ,:/+/-", + " /M/ .,-=;//;-", + " .:/= ;MH/, ,=/+%$XH@MM#@:", + " -$##@+$###@H@MMM#######H:. -/H#", + " .,H@H@ X######@ -H#####@+- -+H###@X", + " .,@##H; +XM##M/, =%@###@X;-", + "X%- :M##########$. .:%M###@%:", + "M##H, +H@@@$/-. ,;$M###@%, -", + "M####M=,,---,.-%%H####M$: ,+@##", + "@##################@/. :%H##@$-", + "M###############H, ;HM##M$=", + "#################. .=$M##M$=", + "################H..;XM##M$= .:+", + "M###################@%= =+@MH%", + "@################M/. =+H#X%=", + "=+M##############M, -/X#X+;.", + " .;XM##########H= ,/X#H+:,", + " .=+HM######M+/+HM@+=.", + " ,:/%XM####H/.", + " ,.:=-.", +}; + +static const char* const ART_EXPLOSION_LINES[] = { + " .+", + " /M;", + " H#@: ;,", + " -###H- -@/", + " %####$. -; .%#X", + " M#####+;#H :M#M.", + ".. .+/;%#########X###-", + " -/%H%+;-, +##############/", + " .:$M###MH$%+############X ,--=;-", + " -/H#####################H+=.", + " .+#################X.", + " =%M####################H;.", + " /@###############+;;/%%;,", + " -%###################$.", + " ;H######################M=", + " ,%#####MH$%;+#####M###-/@####%", + " :$H%+;=- -####X.,H# -+M##@-", + " . ,###; ; =$##+", + " .#H, :XH,", + " + .;-", +}; + +static const char* const ART_RADIO_LINES[] = { + " ;=", + " /=", + " ;=", + " /=", + " ;=", + " /=", + " ;=", + " /=", + " ,--==-:$;", + " ,/$@#######@X+-", + " ./@###############X=", + " /M#####X+/;;;;+H#####$.", + " %####M/;+H@XX@@%;;@####@,", + " +####H=+##$,--,=M#X-%####@.", + " -####X,X@HHXH##MXHXXH-+####$", + " X###@.X/$M$:####$=@X/X,X####-", + ".####:+$:##@:####$:##H/X=####%", + "-%%$%,+==%$+-$+:$;-$$%-+,/$%%+", + "-/+%%X$XX$$$$$$$%$$$%$X$X$%+/-", +}; + +static const char* const ART_ATOM_LINES[] = { + " =/;;/-", + " +: //", + " /; /;", + " -X H.", + ".//;;;:;;-, X= :+ .-;:=;:;%;.", + "M- ,=;;;#:, ,:#;;:=, ,@", + ":% :%.=/++++/=.$= %=", + " ,%; %/:+/;,,/++:+/ ;+.", + " ,+/. ,;@+, ,%H;, ,/+,", + " ;+;;/= @. .H##X -X :///+;", + " ;+=;;;.@, .XM@$. =X.//;=%/.", + " ,;: :@%= =$H: .+%-", + " ,%= %;-///==///-// =%,", + ";+ :%-;;;:;;;;-X- +:", + "@- .-;;;;M- =M/;;;-. -X", + " :;;::;;-. %- :+ ,-;;-;:==", + " ,X H.", + " ;/ %=", + " // +;", + " ,////,", +}; + +static const char* const ART_BIOHAZARD_LINES[] = { + " =+$HM####@H%;,", + " /H###############M$,", + " ,@################+", + " .H##############+", + " X############/", + " $##########/", + " %########/", + " /X/;;+X/", + "", + " -XHHX-", + " ,######,", + "#############X .M####M. X#############", + "##############- -//- -##############", + "X##############%, ,+##############X", + "-##############X X##############-", + " %############% %############%", + " %##########; ;##########%", + " ;#######M= =M#######;", + " .+M###@, ,@###M+.", + " :XH. .HX:", +}; + +static const char* const ART_BLACKMESA_LINES[] = { + " .-;+$XHHHHHHX$+;-.", + " ,;X@@X%/;=----=:/%X@@X/,", + " =$@@%=. .=+H@X:", + " -XMX: =XMX=", + " /@@: =H@+", + " %@X, .$@$", + " +@X. $@%", + "-@@, .@@=", + "%@% +@$", + "H@: :@H", + "H@: :HHHHHHHHHHHHHHHHHHX, =@H", + "%@% ;@M@@@@@@@@@@@@@@@@@H- +@$", + "=@@, :@@@@@@@@@@@@@@@@@@@@@= .@@:", + " +@X :@@@@@@@@@@@@@@@M@@@@@@:%@%", + " $@$, ;@@@@@@@@@@@@@@@@@M@@@@@@$.", + " +@@HHHHHHH@@@@@@@@@@@@@@@@@@@@@@@+", + " =X@@@@@@@@@@@@@@@@@@@@@@@@@@@@X=", + " :$@@@@@@@@@@@@@@@@@@@M@@@@$:", + " ,;$@@@@@@@@@@@@@@@@@@X/-", + " .-;+$XXHHHHHX$+;-.", +}; + +static const char* const ART_BROKENHEART_LINES[] = { + " .,---.", + " ,/XM#MMMX;,", + " -%##########M%,", + " -@######% $###@=", + " .,--, -H#######$ $###M:", + " ,;$M###MMX; .;##########$;HM###X=", + " ,/@##########H= ;################+", + "-+#############M/, %##############+", + "%M###############= /##############:", + "H################ .M#############;.", + "@###############M ,@###########M:.", + "X################, -$=X#######@:", + "/@##################%- +######$-", + ".;##################X .X#####+,", + " .;H################/ -X####+.", + " ,;X##############, .MM/", + " ,:+$H@M#######M#$- .$$=", + " .,-=;+$@###X: ;/=.", + " .,/X$; .::,", + " ., ..", +}; + +static const char* const ART_CHECK_LINES[] = { + " :X-", + " :X###", + " ;@####@", + " ;M######X", + " -@########$", + " .$##########@", + " =M############-", + " +##############$", + " .H############$=.", + " ,/: ,M##########M;.", + " -+@###; =##########M;", + " =%M#######; :#########M/", + "-$M###########; :#########/", + " ,;X###########; =########$.", + " ;H#########+#######M=", + " ,+##############+", + " /M#########@-", + " ;M######%", + " +####:", + " ,$M-", +}; + +static const char* const ART_COMPANIONCUBE_LINES[] = { + "+@##########M/ :@#########@/", + "##############$;H#######@;+#############", + "###############M########################", + "##############X,-/++/+%+/,%#############", + "############M$: -X############", + "##########H;. ,--. =X##########", + ":X######M; -$H@M##MH%: :H#######@", + " =%#M+=, ,+@#######M###H: -=/M#%", + " %M##@+ .X##$, ./+- ./###; +M##%", + " %####M. /###= @##M. X###%", + " %####M. ;M##H:. =$###X. $###%", + " %####@. /####M$-./@#####: %###%", + " %H#M/, /H###########@: ./M#%", + " ;$H##@@H: .;$HM#MMMH$;, ./H@M##M$=", + "X#########%. ..,,. .;@#########", + "###########H+:. ./@###########", + "##############/ ./%%%%+/.-M#############", + "##############H$@#######@@##############", + "##############X%########M$M#############", + "+M##########H: .$##########X=", +}; + +static const char* const ART_FIRE_LINES[] = { + " -$-", + " .H##H,", + " +######+", + " .+#########H.", + " -$############@.", + " =H###############@ -X:", + " .$##################: @#@-", + " ,; .M###################; H###;", + " ;@#: @###################@ ,#####:", + " -M###. M#################@. ;######H", + " M####- +###############$ =@#######X", + " H####$ -M###########+ :#########M,", + " /####X- =########% :M########@/.", + " ,;%H@X; .$###X :##MM@%+;:-", + " ..", + " -/;:-,. ,,-==+M########H", + " -##################@HX%%+%%$%%%+:,,", + " .-/H%%%+%%$H@###############M@+=:/+:", + "/XHX%:#####MH%= ,---:;;;;/%%XHM,:###$", +}; + +static const char* const ART_GLADOS_LINES[] = { + " #+ @ # # M#@", + " . .X X.%##@;# # +@#######X. @#%", + " ,==. ,######M+ -#####%M####M- #", + " :H##M%:=##+ .M##M,;#####/+#######% ,M#", + " .M########= =@#@.=#####M=M#######= X#", + " :@@MMM##M. -##M.,#######M#######. = M", + " @##..###:. .H####. @@ X,", + " ############: ###,/####; /##= @#. M", + " ,M## ;##,@#M;/M#M @# X#% X#", + ".%= ######M## ##.M#: ./#M ,M #M ,#$", + "##/ $## #+;#: #### ;#/ M M- @# :", + "#+ #M@MM###M-;M #:$#-##$H# .#X @ + $#. #", + " ######/.: #%=# M#:MM./#.-# @#: H#", + "+,.= @###: /@ %#,@ ##@X #,-#@.##% .@#", + "#####+;/##/ @## @#,+ /#M . X,", + " ;###M#@ M###H .#M- ,##M ;@@; ###\"", + " .M#M##H ;####X ,@#######M/ -M###$ -H", + " .M###% X####H .@@MM@; ;@#M@", + " H#M /@####/ ,++. / ==-,", + " ,=/:, .+X@MMH@#H #####$=", +}; + +static const char* const ART_LIGHTBULB_LINES[] = { + " ,=;%$%%$X%%%%;/%%%%;=,", + " ,/$$+:- -:+$$/,", + " :X$= =$X:", + " ;M%. .%M;", + "+#/ /#+", + "## M#", + "H#, =;+/;, ,#X", + ".HM- :@X+%H: .%M%- .M#. -M@.", + " /#%. @#- ,H@--MH, .;@$- .%#+", + " .$M; .+@X;, MM#@:/$X;. ;M$,", + " =@H, ,:+%H#M%;- ,H@=", + " .$#; -#H =#$", + " %#; #M ;#%", + " H#- ## -#H", + " ;#+ ## +#;", + " ;H+;;;;;;HH;;;;;;+H/", + " =H#@HHHHHHHHHH@#H=", + " =@#H%%%%%%%$HH@#@=", + " =@#X%%%%%%%$M###@=", + " =+%XHHX%+=", +}; + +static const char* const ART_MECHARM_LINES[] = { + " X MM X", + " X MM X", + " X MM X", + " X MM X", + " + HX +", + " ,=$$XX%/-", + " =X#########@%-", + " ;##############=", + "-###############M,", + ";##@@@######M@###=", + ".+:;+:=H##$=:/:;H.", + "- +###- ## :###,,;", + "+@:/%;-H##H==/::H;", + " /#@/-=+$$%::+H#$", + " $#%-, ,.:##-", + "-@/ =X%.", + "%H= -$;", + " =HH, .%M;", + " /MM/ :@M/.", + " .:XX, -$H:.", +}; + +static const char* const ART_PERSONALITYSPHERE_LINES[] = { + " .-+$H###MM@MMMMM##@$+-,. ....", + "-@$+%$+%HX+--.. . . .,:X$/+/++$#:", + "-#MXH$= $HXH#:", + " .--,:#+ ,+$HMX =@@X%, . .X#:,,,", + " =#@$H :####H =####;,M%$#X", + " X###$ $####X =####H %###X", + " ;###X /###@$: ,+HM##H.+###;", + " :###;,X##%=;%H@H$;-;M#@-;###/", + " ,M##;.@##;-H#######M=.M##-:###-", + " ;##M ;##X @###H-=@###.;##X H##;", + " ;##M./##X.@###H:/M###-=##X X##;", + " -###;,M##:,@########+-H##; @##-", + " %##M==@##%==%HMH%::/M##+.X##+", + " %###/./###X+: -+$M##M=,X##+", + " X###X X####H +#####% @##H", + " :###H %####H +#####; X##;", + " /#$. -HM##H /###@+. +#$. .", + "/HX%$X: .,-, .-,. =XX$H@-", + "/#H+/+%+/+;=. .=/%;;/;;+#+", + " .. .,-:XM#MM@@@@@@H@@M#@+=,. ,,", +}; + +static const Art ARTS[] = { + {nullptr, 0}, + {ART_APERTURE_LINES, 20}, // 1 + {ART_CAKE_LINES, 20}, // 2 + {ART_EXPLOSION_LINES, 20}, // 3 + {ART_RADIO_LINES, 19}, // 4 + {ART_ATOM_LINES, 20}, // 5 + {ART_BIOHAZARD_LINES, 20}, // 6 + {ART_BLACKMESA_LINES, 20}, // 7 + {ART_BROKENHEART_LINES, 20}, // 8 + {ART_CHECK_LINES, 20}, // 9 + {ART_COMPANIONCUBE_LINES, 20}, // 10 + {ART_FIRE_LINES, 19}, // 11 + {ART_GLADOS_LINES, 20}, // 12 + {ART_LIGHTBULB_LINES, 20}, // 13 + {ART_MECHARM_LINES, 20}, // 14 + {ART_PERSONALITYSPHERE_LINES, 20}, // 15 +}; +static constexpr size_t ART_COUNT = sizeof(ARTS) / sizeof(ARTS[0]); + +static const LyricStep LYRICS[] = { + {0, 0, STEP_CLEAR, ART_KEEP, ""}, + {0, 2000, STEP_NEWLINE, ART_KEEP, "Forms FORM-29827281-12:"}, + {2000, 2000, STEP_NEWLINE, ART_KEEP, "Test Assessment Report"}, + {4010, 0, STEP_NEWLINE, ART_KEEP, ""}, + {4020, 0, STEP_NEWLINE, ART_KEEP, ""}, + {6870, 2050, STEP_NEWLINE, ART_KEEP, "This was a triumph."}, + {10820, 2100, STEP_NEWLINE, ART_KEEP, "I'm making a note here:"}, + {12930, 1800, STEP_NEWLINE, ART_KEEP, "HUGE SUCCESS."}, + {15730, 2360, STEP_NEWLINE, ART_KEEP, "It's hard to overstate"}, + {18130, 2710, STEP_NEWLINE, ART_KEEP, "my satisfaction."}, + {22970, 1760, STEP_NEWLINE, 1, "Aperture Science"}, + {26830, 1570, STEP_NEWLINE, ART_KEEP, "We do what we must"}, + {28600, 750, 0, ART_KEEP, "because"}, + {29550, 710, STEP_NEWLINE, ART_KEEP, "we can."}, + {31930, 1550, 0, ART_KEEP, "For the good"}, + {33480, 1530, STEP_NEWLINE, ART_KEEP, "of all of us."}, + {35289, 1741, STEP_NEWLINE, 6, "Except the ones who are dead."}, + {37030, 400, STEP_NEWLINE, ART_KEEP, ""}, + {37430, 1858, STEP_NEWLINE, 1, "But there's no sense crying"}, + {39298, 1782, STEP_NEWLINE, ART_KEEP, "over every mistake."}, + {41280, 1985, STEP_NEWLINE, ART_KEEP, "You just keep on trying"}, + {43275, 1366, 0, ART_KEEP, "till you run out of"}, + {44641, 400, STEP_NEWLINE, ART_KEEP, "cake."}, + {45227, 1970, STEP_NEWLINE, 5, "And the Science gets done."}, + {47197, 1970, STEP_NEWLINE, ART_KEEP, "And you make a neat gun."}, + {49187, 1520, STEP_NEWLINE, 1, "For the people who are"}, + {50727, 1500, STEP_NEWLINE, ART_KEEP, "still alive."}, + {53827, 0, STEP_CLEAR, ART_KEEP, ""}, + {53827, 550, STEP_NEWLINE, ART_KEEP, "Forms FORM-55551-5:"}, + {54377, 1100, STEP_NEWLINE, ART_KEEP, "Personnel File Addendum:"}, + {55477, 0, STEP_NEWLINE, ART_KEEP, ""}, + {58487, 0, STEP_NEWLINE, ART_KEEP, ""}, + {58547, 1917, STEP_NEWLINE, ART_KEEP, "I'm not even angry."}, + {62832, 697, 0, ART_KEEP, "I'm being"}, + {63529, 650, 0, ART_KEEP, "so"}, + {64179, 906, 0, ART_KEEP, "sincere"}, + {65085, 1115, STEP_NEWLINE, ART_KEEP, "right now."}, + {67825, 650, 0, ART_KEEP, "Even"}, + {68475, 1347, 0, ART_KEEP, "though you"}, + {69822, 488, 0, 8, "broke"}, + {70310, 998, STEP_NEWLINE, ART_KEEP, "my heart."}, + {71308, 325, 0, ART_KEEP, "And"}, + {71633, 488, 0, ART_KEEP, "killed"}, + {72121, 557, STEP_NEWLINE, ART_KEEP, "me."}, + {74678, 1649, STEP_NEWLINE, 3, "And tore me to pieces."}, + {78649, 1440, 0, ART_KEEP, "And threw every piece"}, + {80091, 580, 0, ART_KEEP, "into"}, + {81066, 882, STEP_NEWLINE, 11, "a fire."}, + {83597, 1400, 0, ART_KEEP, "As they burned"}, + {84997, 1509, STEP_NEWLINE, ART_KEEP, "it hurt because"}, + {86831, 1625, STEP_NEWLINE, 9, "I was so happy for you!"}, + {88897, 2067, STEP_NEWLINE, ART_KEEP, "Now these points of data"}, + {90964, 1950, STEP_NEWLINE, ART_KEEP, "make a beautiful line."}, + {92914, 2020, STEP_NEWLINE, ART_KEEP, "And we're out of beta."}, + {94934, 1950, STEP_NEWLINE, ART_KEEP, "We're releasing on time."}, + {96884, 2113, STEP_NEWLINE, 3, "So I'm GLaD. I got burned."}, + {98997, 2020, STEP_NEWLINE, 5, "Think of all the things we learned"}, + {101017, 1556, STEP_NEWLINE, 1, "for the people who are"}, + {102573, 395, 0, ART_KEEP, "still"}, + {102968, 1440, STEP_NEWLINE, ART_KEEP, "alive."}, + {106008, 0, STEP_CLEAR, ART_KEEP, ""}, + {106008, 450, STEP_NEWLINE, ART_KEEP, "Forms FORM-55551-6:"}, + {106459, 1310, STEP_NEWLINE, ART_KEEP, "Personnel File Addendum Addendum:"}, + {107768, 0, STEP_NEWLINE, ART_KEEP, ""}, + {108428, 2200, STEP_NEWLINE, ART_KEEP, "One last thing:"}, + {110628, 0, STEP_NEWLINE, ART_KEEP, ""}, + {110678, 1324, 0, ART_KEEP, "Go ahead and leave"}, + {112002, 627, STEP_NEWLINE, ART_KEEP, "me."}, + {114417, 534, 0, ART_KEEP, "I think"}, + {114951, 1184, 0, ART_KEEP, "I prefer"}, + {116135, 1022, 0, ART_KEEP, "to stay"}, + {117157, 232, 0, ART_KEEP, "in"}, + {117389, 882, STEP_NEWLINE, ART_KEEP, "side."}, + {119701, 511, 0, ART_KEEP, "May"}, + {120212, 2972, STEP_NEWLINE, ART_KEEP, "be you'll find someone else"}, + {123184, 1254, STEP_NEWLINE, ART_KEEP, "to help you."}, + {126690, 511, 0, ART_KEEP, "Maybe"}, + {127201, 325, 0, 7, "Black"}, + {127526, 998, 0, ART_KEEP, "Mesa"}, + {128524, 2183, STEP_NEWLINE, ART_KEEP, "..."}, + {130707, 1440, 0, ART_KEEP, "THAT WAS A JOKE."}, + {133168, 279, 0, ART_KEEP, "FAT"}, + {133447, 859, STEP_NEWLINE, ART_KEEP, "CHANCE."}, + {135699, 1486, 0, ART_KEEP, "Anyway"}, + {137185, 1765, STEP_NEWLINE, 2, ", this cake is great."}, + {138950, 1904, STEP_NEWLINE, ART_KEEP, "It's so delicious and moist."}, + {141272, 1927, STEP_NEWLINE, 12, "Look at me still talking"}, + {143199, 2090, STEP_NEWLINE, 6, "when there's Science to do."}, + {145289, 1695, STEP_NEWLINE, 1, "When I look out there,"}, + {146984, 2183, STEP_NEWLINE, ART_KEEP, "it makes me GLaD I'm not you."}, + {149167, 2043, STEP_NEWLINE, 5, "I've experiments to run."}, + {151210, 2020, STEP_NEWLINE, 3, "There is research to be done."}, + {153230, 1625, STEP_NEWLINE, 1, "On the people who are"}, + {154855, 348, 0, ART_KEEP, "still"}, + {155203, 1440, STEP_NEWLINE, ART_KEEP, "alive."}, + {156843, 0, STEP_CLEAR, ART_KEEP, ""}, + {156953, 0, STEP_NEWLINE, ART_KEEP, ""}, + {156963, 0, STEP_NEWLINE, ART_KEEP, ""}, + {156973, 0, STEP_NEWLINE, ART_KEEP, ""}, + {156983, 300, 0, ART_NONE, "PS: "}, + {157283, 1625, STEP_NEWLINE, ART_KEEP, "And believe me I am"}, + {158908, 1138, STEP_NEWLINE, ART_KEEP, "still alive."}, + {160846, 198, 0, ART_KEEP, "PPS: "}, + {161044, 1904, STEP_NEWLINE, ART_KEEP, "I'm doing Science and I'm"}, + {162948, 1091, STEP_NEWLINE, ART_KEEP, "still alive."}, + {164839, 175, 0, ART_KEEP, "PPPS: "}, + {165014, 1904, STEP_NEWLINE, ART_KEEP, "I feel FANTASTIC and I'm"}, + {166918, 1091, STEP_NEWLINE, ART_KEEP, "still alive."}, + {168009, 0, STEP_NEWLINE, ART_KEEP, ""}, + {168109, 1154, STEP_NEWLINE, ART_KEEP, "FINAL THOUGHT: "}, + {169263, 1579, STEP_NEWLINE, ART_KEEP, "While you're dying I'll be"}, + {170842, 1254, STEP_NEWLINE, ART_KEEP, "still alive."}, + {172096, 0, STEP_NEWLINE, ART_KEEP, ""}, + {172196, 829, STEP_NEWLINE, ART_KEEP, "FINAL THOUGHT PS: "}, + {173025, 1834, STEP_NEWLINE, ART_KEEP, "And when you're dead I will be"}, + {174859, 1161, STEP_NEWLINE, ART_KEEP, "still alive."}, + {176020, 0, STEP_NEWLINE, ART_KEEP, ""}, + {176479, 0, STEP_NEWLINE, ART_KEEP, ""}, + {176879, 1184, STEP_NEWLINE, ART_KEEP, "STILL ALIVE"}, + {179250, 0, STEP_CLEAR, ART_KEEP, ""}, + {180250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {181250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {182250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {183250, 1500, STEP_NEWLINE, ART_KEEP, " ***"}, + {184750, 1500, STEP_NEWLINE, ART_KEEP, " Portal? 10th anniversary"}, + {186250, 1500, STEP_NEWLINE, ART_KEEP, " 'Still Alive' ending scene"}, + {187750, 1500, STEP_NEWLINE, ART_KEEP, " remade with HTML, JS"}, + {189250, 2500, STEP_NEWLINE, ART_KEEP, " by SD SkyKlouD"}, + {191750, 0, STEP_NEWLINE, ART_KEEP, ""}, + {192250, 600, STEP_NEWLINE, ART_KEEP, " ? 2007- Valve Corporation."}, + {192850, 900, STEP_NEWLINE, ART_KEEP, " All Rights Reserved."}, + {193750, 1500, STEP_NEWLINE, ART_KEEP, " Valve, Steam, Portal are trademarks"}, + {195250, 1500, STEP_NEWLINE, ART_KEEP, " and/or registered trademarks of"}, + {196750, 1500, STEP_NEWLINE, ART_KEEP, " Valve Corporation. All other trademarks"}, + {198250, 1500, STEP_NEWLINE, ART_KEEP, " are property of their respective owners."}, + {200250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {200750, 2000, STEP_NEWLINE, ART_KEEP, " For the full legal info, please refer"}, + {204250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {229250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {229350, 0, STEP_NEWLINE, ART_KEEP, ""}, + {229450, 0, STEP_NEWLINE, ART_KEEP, ""}, + {229750, 4000, STEP_NEWLINE, ART_KEEP, "... is anyone there?"}, + {241750, 3000, STEP_NEWLINE, ART_KEEP, "I think you can leave here now."}, + {245250, 0, STEP_NEWLINE, ART_KEEP, ""}, + {246250, 2000, STEP_NEWLINE, ART_KEEP, "Here would be no profit"}, + {248750, 2000, STEP_NEWLINE, ART_KEEP, "if you stay here more and more."}, + {273939, 0, STEP_CLEAR, ART_KEEP, ""}, + {274439, 0, STEP_NEWLINE, ART_KEEP, ""}, + {274939, 0, STEP_NEWLINE, ART_KEEP, ""}, + {275439, 0, STEP_NEWLINE, ART_KEEP, ""}, + {275939, 5000, STEP_NEWLINE, ART_KEEP, "... will you play a game with me?"}, + {281439, 2000, STEP_NEWLINE, ART_KEEP, "I know a simple game, called"}, + {283939, 0, STEP_NEWLINE, ART_KEEP, ""}, + {284939, 5000, STEP_NEWLINE, ART_KEEP, "// Getting Faster and Faster //"}, + {290939, 2000, STEP_NEWLINE, ART_KEEP, "... I just said this is a simple game."}, + {293439, 500, 0, ART_KEEP, "Actually,"}, + {294939, 3500, 0, ART_KEEP, "THIS IS NOT A GAME."}, +}; +static constexpr size_t LYRIC_COUNT = sizeof(LYRICS) / sizeof(LYRICS[0]); + +static const char* const CREDITS[] = { + ">LIST PERSONNEL", + "", + "", + "Gautam Babbar", + "Ted Backman", + "Kelly Bailey", + "Jeff Ballinger", + "Aaron Barber", + "Jeep Barnett", + "Jeremy Bennett", + "Dan Berger", + "Yahn Bernier", + "Ken Birdwell", + "Derrick Birum", + "Mike Blaszczak", + "Iestyn Bleasdale-Shepherd", + "Chris Bokitch", + "Steve Bond", + "Matt Boone", + "Antoine Bourdon", + "Jamaal Bradley", + "Jason Brashill", + "Charlie Brown", + "Charlie Burgin", + "Andrew Burke", + "Augusta Butlin", + "Julie Caldwell", + "Dario Casali", + "Chris Chin", + "Jess Cliffe", + "Phil Co", + "John Cook", + "Christen Coomer", + "Greg Coomer", + "Scott Dalton", + "Kerry Davis", + "Jason Deakins", + "Joe Demers", + "Ariel Diaz", + "Quintin Doroquez", + "Jim Dose", + "Chris Douglass", + "Laura Dubuk", + "Mike Dunkle", + "Mike Durand", + "Mike Dussault", + "Dhabih Eng", + "Katie Engel", + "Chet Faliszek", + "Adrian Finol", + "Bill Fletcher", + "Moby Francke", + "Stephane Gaudette", + "Kathy Gehrig", + "Vitaliy Genkin", + "Paul Graham", + "Chris Green", + "Chris Grinstead", + "John Guthrie", + "Aaron Halifax", + "Reagan Halifax", + "Leslie Hall", + "Jeff Hameluck", + "Joe Han", + "Don Holden", + "Jason Holtman", + "Gray Horsfield", + "Keith Huggins", + "Jim Hughes", + "Jon Huisingh", + "Brian Jacobson", + "Lars Jensvold", + "Erik Johnson", + "Jakob Jungels", + "Rich Kaethler", + "Steve Kalning", + "Aaron Kearly", + "Iikka Keranen", + "David Kircher", + "Eric Kirchmer", + "Scott Klintworth", + "Alden Kroll", + "Marc Laidlaw", + "Jeff Lane", + "Tim Larkin", + "Dan LeFree", + "Isabelle LeMay", + "Tom Leonard", + "Jeff Lind", + "Doug Lombardi", + "Bianca Loomis", + "Richard Lord", + "Realm Lovejoy", + "Randy Lundeen", + "Scott Lynch", + "Ido Magal", + "Nick Maggiore", + "John McCaskey", + "Patrick McClard", + "Steve McClure", + "Hamish McKenzie", + "Gary McTaggart", + "Jason Mitchell", + "Mike Morasky", + "John Morello II", + "Bryn Moslow", + "Arsenio Navarro", + "Gabe Newell", + "Milton Ngan", + "Jake Nicholson", + "Martin Otten", + "Nick Papineau", + "Karen Prell", + "Bay Raitt", + "Tristan Reidford", + "Alfred Reynolds", + "Matt Rhoten", + "Garret Rickey", + "Dave Riller", + "Elan Ruskin", + "Matthew Russell", + "Jason Ruymen", + "David Sawyer", + "Marc Scaparro", + "Wade Schin", + "Matthew Scott", + "Aaron Seeler", + "Jennifer Seeley", + "Taylor Sherman", + "Eric Smith", + "Jeff Sorensen", + "David Speyrer", + "Jay Stelly", + "Jeremy Stone", + "Eric Strand", + "Kim Swift", + "Kelly Thornton", + "Eric Twelker", + "Carl Uhlman", + "Doug Valente", + "Bill Van Buren", + "Gabe Van Engel", + "Alex Vlachos", + "Robin Walker", + "Joshua Weier", + "Andrea Wicklund", + "Greg Winkler", + "Erik Wolpaw", + "Doug Wood", + "Matt T. Wood", + "Danika Wright", + "Matt Wright", + "Shawn Zabecki", + "Torsten Zabka ", + "", + "", + "", + "", + "'Still Alive' by:", + "Jonathan Coulton", + "", + "", + "", + "Voices:", + "Ellen McLain - GlaDOS, Turrets", + "Mike Patton - THE ANGER SPHERE", + "", + "", + "", + "Voice Casting:", + "Shana LandsburgTeri Fiddleman", + "", + "", + "", + "", + "Voice Recording:", + "Pure Audio, Seattle, WA", + "", + "", + "", + "", + "Voice recording", + "scheduling and logistics:", + "Pat Cockburn, Pure Audio", + "", + "", + "", + "", + "Translations:", + "SDL", + "", + "", + "", + "", + "Crack Legal Team:", + "Liam Lavery", + "Karl Quackenbush", + "Kristen Boraas", + "Kevin Rosenfield", + "Alan Bruggeman", + "Dennis Tessier", + "", + "", + "", + "Thanks for the use of their face:", + "Alesia Glidewell - Chell", + "", + "", + "", + "Special thanks to everyone at:", + "Alienware", + "ATI", + "Dell", + "Falcon Northwest", + "Havok", + "SOFTIMAGE", + "and Don Kemmis, SLK Technologies", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "THANK YOU FOR PARTICIPATING", + "IN THIS", + "ENRICHMENT CENTER ACTIVITY!!", + "", + "", + "", + "", + "", + "", + "", + "", +}; +static constexpr size_t CREDIT_COUNT = sizeof(CREDITS) / sizeof(CREDITS[0]); + +static constexpr uint32_t SONG_START_MS = 6750; +static constexpr uint32_t CREDITS_START_MS = 9000; +static constexpr uint32_t CREDIT_CHAR_US = 68624; +static constexpr bool CREDITS_LOOP = false; diff --git a/tools/import_still_alive.py b/tools/import_still_alive.py index b320d64..14547f6 100644 --- a/tools/import_still_alive.py +++ b/tools/import_still_alive.py @@ -10,7 +10,7 @@ placeholder lyrics.h / art.h / credits.h when it exists. python tools/import_still_alive.py --html index.html --js stillalive.js python tools/import_still_alive.py --out somewhere/imported.h -imported.h is listed in .gitignore, so the imported text stays on your machine. +imported.h is committed with a disclaimer and source reference at its top. Source format: each
is one screen (the console clears when it starts). Inside it,