From: Paul Hänsch Date: Thu, 6 Feb 2020 17:10:31 +0000 (+0100) Subject: generate js gamedata file statically X-Git-Url: https://git.plutz.net/?a=commitdiff_plain;h=65255ce39cc54700ed3b57b0c04c066fd7a9affc;p=flarejs generate js gamedata file statically --- diff --git a/Makefile b/Makefile index 24781a9..9a51dac 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +default: _subtrees data.js + .PHONY: _subtrees _subtrees: _cgilite @@ -7,3 +9,6 @@ cgilite: _cgilite: cgilite git subtree pull --squash -P $< https://git.plutz.net/git/$< master + +data.js: data.sh mods/ + ./$< >$@ diff --git a/data.sh b/data.sh new file mode 100755 index 0000000..be6b3fb --- /dev/null +++ b/data.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +printf 'gamedata = {\n' +for base in mods/fantasycore mods/empyrean_campaign; do + find $base/animations -name '*.txt' |while read -r file; do + file="${file#"${base}"}" + printf '"%s": {\n' "$file" + sed -E ' + # read entire file into buffer + :X N; $!bX; s;$;\n;; s;^;\n;; s;\r\n;\n;g; + + # Comment and empty lines + :Y s;\n#[^\n]*\n;\n;g; tY; + + # INCLUDE, APPEND + s;\nAPPEND\n;\n;g; + s;\nINCLUDE ([^\n]+)\n;\n"INCLUDE": "\1"\n;g; + + # section heading, eg. [stance] + s;\n\[([^\n]+)\]\n(([^]\n[]+\n)+);"\1": {\n\2 },\n;g; + + # frame list start + s;\nframes=[0-9]+\n;\n;g; + s;(\nframe=[^\n]+)+;\n"frames": [&;g; + + # frame list, 8 angles isometric + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [\7], [\8]],\n;g + # frame list, workaround for bug in avatar/female/dagger.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [0,0,0,0,0,0], [\3], [\4], [\5], [\6], [\7]],\n;g + # frame list, workaround for bug in avatar/male/greatsword.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [0,0,0,0,0,0], [\7]],\n;g + # frame list, workaround for bug in avatar/male/slingshot.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [0,0,0,0,0,0], [\4], [\5], [\6], [\7]],\n;g + # frame list, 6 angles e.g. powers/freeze.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6]],\n;g + # frame list, 4 angles e.g. powers/spikes.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\n;[[\1], [\2], [\3], [\4]],\n;g + # frame list, 3 angles e.g. powers/quake.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\n;[[\1], [\2], [\3]],\n;g + # frame list, 2 angles e.g. powers/blast.txt + s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\n;[[\1], [\2]],\n;g + # frame list, front angle only + s;frame=[0-9]+,0,([0-9,-]+)\n;[[\1]],\n;g + + # frame list end + s;("frames": []\n,0-9 [-]+),;\1\n],;g; + + # animation duration + s;\n(duration)=([0-9]+)ms\n;\n"\1": \2,\n;g + s;\n(duration)=([0-9]+)s\n;\n"\1": \2000,\n;g + + :general + # general scalar + s;\n([^=\n]+)=([0-9-]+)\n;\n"\1": \2,\n;g + + # general array + s;\n([^=\n]+)=([0-9,-]+)\n;\n"\1": [\2],\n;g + + # general text + s;\n([^=\n]+)=([^\n]+)\n;\n"\1": "\2",\n;g + tgeneral; + ' "${base}${file}" + printf '},\n' + done +done +printf '}\n' diff --git a/index.cgi b/index.cgi index d8423cb..da8c8a8 100755 --- a/index.cgi +++ b/index.cgi @@ -12,84 +12,23 @@ if [ "$_PATH" = / ]; then FlareJS - - + + $( + for base in mods/fantasycore mods/empyrean_campaign; do + find $base/images/avatar $base/images/enemies -name '*.png' |while read -r file; do + file="${file#"${base}/"}" + printf '' "$file" + done + done) EOF -elif [ "$_PATH" = "/data.js" -a data.js -nt "$0" ]; then - FILE data.js -elif [ "$_PATH" = "/data.js" -a ! data.js -nt "$0" ]; then - printf 'Content-Type: text/javascript\r\n\r\n' - { - printf 'gamedata = {\n' - for base in /usr/share/games/flare/mods/fantasycore /usr/share/games/flare/mods/empyrean_campaign; do - find $base/animations -name '*.txt' |while read -r file; do - file="${file#"${base}"}" - printf '"%s": {\n' "$file" - sed -E ' - # read entire file into buffer - :X N; $!bX; s;$;\n;; s;^;\n;; s;\r\n;\n;g; - - # Comment and empty lines - :Y s;\n#[^\n]*\n;\n;g; tY; - - # INCLUDE, APPEND - s;\nAPPEND\n;\n;g; - s;\nINCLUDE ([^\n]+)\n;\n"INCLUDE": "\1"\n;g; - - # section heading, eg. [stance] - s;\n\[([^\n]+)\]\n(([^]\n[]+\n)+);"\1": {\n\2 },\n;g; - - # frame list start - s;\nframes=[0-9]+\n;\n;g; - s;(\nframe=[^\n]+)+;\n"frames": [&;g; - - # frame list, 8 angles isometric - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [\7], [\8]],\n;g - # frame list, workaround for bug in avatar/female/dagger.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [0,0,0,0,0,0], [\3], [\4], [\5], [\6], [\7]],\n;g - # frame list, workaround for bug in avatar/male/greatsword.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6], [0,0,0,0,0,0], [\7]],\n;g - # frame list, workaround for bug in avatar/male/slingshot.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\nframe=[0-9]+,6,([0-9,-]+)\nframe=[0-9]+,7,([0-9,-]+)\n;[[\1], [\2], [\3], [0,0,0,0,0,0], [\4], [\5], [\6], [\7]],\n;g - # frame list, 6 angles e.g. powers/freeze.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\nframe=[0-9]+,4,([0-9,-]+)\nframe=[0-9]+,5,([0-9,-]+)\n;[[\1], [\2], [\3], [\4], [\5], [\6]],\n;g - # frame list, 4 angles e.g. powers/spikes.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\nframe=[0-9]+,3,([0-9,-]+)\n;[[\1], [\2], [\3], [\4]],\n;g - # frame list, 3 angles e.g. powers/quake.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\nframe=[0-9]+,2,([0-9,-]+)\n;[[\1], [\2], [\3]],\n;g - # frame list, 2 angles e.g. powers/blast.txt - s;frame=[0-9]+,0,([0-9,-]+)\nframe=[0-9]+,1,([0-9,-]+)\n;[[\1], [\2]],\n;g - # frame list, front angle only - s;frame=[0-9]+,0,([0-9,-]+)\n;[[\1]],\n;g - - # frame list end - s;("frames": []\n,0-9 [-]+),;\1\n],;g; - - # animation duration - s;\n(duration)=([0-9]+)ms\n;\n"\1": \2,\n;g - s;\n(duration)=([0-9]+)s\n;\n"\1": \2000,\n;g - - :general - # general scalar - s;\n([^=\n]+)=([0-9-]+)\n;\n"\1": \2,\n;g - - # general array - s;\n([^=\n]+)=([0-9,-]+)\n;\n"\1": [\2],\n;g - - # general text - s;\n([^=\n]+)=([^\n]+)\n;\n"\1": "\2",\n;g - tgeneral; - ' "${base}${file}" - printf '},\n' - done - done - printf '}\n' - } |tee data.js else - for base in . /usr/share/games/flare/mods/empyrean_campaign /usr/share/games/flare/mods/fantasycore /usr/share/games/flare/mods/default; do + for base in . \ + ./mods/empyrean_campaign \ + ./mods/fantasycore \ + ./mods/default; do [ -f "${base}/$_PATH" ] && FILE "${base}/$_PATH" done fi diff --git a/mods b/mods new file mode 120000 index 0000000..48c596d --- /dev/null +++ b/mods @@ -0,0 +1 @@ +/usr/share/games/flare/mods/ \ No newline at end of file