Asscalc Commands: Unterschied zwischen den Versionen
(13 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Commandos in ASSCalc können als feste Funktionen angesehen werden. Sie können für verschiedene Zwecke eingesetzt werden, haben aber auch gewisse Macken, welche man kennen sollte, aber seht selbst ;) Grundsätzlich beziehen sich diese Funktionen auf die "lines", d.h. sie sind dafür ausgelegt im P Layer benutzt zu werden, im Header funktionieren sie meißt falsch oder eher gar nicht. | Commandos in ASSCalc können als feste Funktionen angesehen werden. Sie können für verschiedene Zwecke eingesetzt werden, haben aber auch gewisse Macken, welche man kennen sollte, aber seht selbst ;) Grundsätzlich beziehen sich diese Funktionen auf die "lines", d.h. sie sind dafür ausgelegt im P Layer benutzt zu werden, im Header funktionieren sie meißt falsch oder eher gar nicht. | ||
+ | ==Ausgabe einer Variable== | ||
| ''lines'' ''' expr '\n' ''' { print_tval_of( $2.value );/*fprintf( foutt, "%.12g", $2.value) */} | | ''lines'' ''' expr '\n' ''' { print_tval_of( $2.value );/*fprintf( foutt, "%.12g", $2.value) */} | ||
Zeile 10: | Zeile 11: | ||
''' | ''' | ||
+ | ==Ausgabe eines Strings== | ||
| ''lines'' ''' STRING '\n' ''' { fprintf( foutt, "%s", $2.name) } | | ''lines'' ''' STRING '\n' ''' { fprintf( foutt, "%s", $2.name) } | ||
Zeile 23: | Zeile 25: | ||
" | " | ||
+ | |||
Dialog: " | Dialog: " | ||
''' | ''' | ||
+ | ==Variable setzen/definieren== | ||
| ''lines'' ''' IDENTIFIER '=' expr '\n' ''' { set_identifier( $2, $4.value ); } | | ''lines'' ''' IDENTIFIER '=' expr '\n' ''' { set_identifier( $2, $4.value ); } | ||
+ | |||
+ | ==Array setzen/definieren | ||
| ''lines'' ''' IDENTIFIER '[' expr ']' '=' expr '\n' ''' { set_identifier_arr( $2, $7.value, $4.value ); } | | ''lines'' ''' IDENTIFIER '[' expr ']' '=' expr '\n' ''' { set_identifier_arr( $2, $7.value, $4.value ); } | ||
+ | ==Ausgabe von (fester Script-) Variable== | ||
| ''lines'' ''' INSERT IDENTIFIER '\n' ''' { print_identifier( $3.name ); } | | ''lines'' ''' INSERT IDENTIFIER '\n' ''' { print_identifier( $3.name ); } | ||
Fügt Daten aus dem Grundscript in die out.ass ein. Bisher wird dies für Farben und Text/Zeichen/Silbe benötigt. Diese Daten können nicht verarbeitet werden, sondern nur direkt eingefügt werden, sozusagen CopyPasta ;) | Fügt Daten aus dem Grundscript in die out.ass ein. Bisher wird dies für Farben und Text/Zeichen/Silbe benötigt. Diese Daten können nicht verarbeitet werden, sondern nur direkt eingefügt werden, sozusagen CopyPasta ;) | ||
− | + | ||
+ | ===Beispiel:=== | ||
insert text | insert text | ||
Zeile 51: | Zeile 59: | ||
insert @stylecolor1 | insert @stylecolor1 | ||
− | + | fügt den Farbwert ein, welcher an einem Zeitpunkt X vorhanden ist. Dies funktioniert natürlich nur mit vordefinierten Colorchanges im Original.ass. Für die Zeitdefinition wird eine zusätzliche feste Variable benötigt, mit dem Namen ''fetchtime''. Will mam z.B. den Farbwert an tstart wissen, setzt man ''fetchtime = tstart'' und ''stylecolor1@ liefert den passenden Farbwert dazu. | |
− | ''' | + | |
+ | |||
+ | '''<u>Beispiel mit fetchtime = tstart</u>''' | ||
+ | |||
+ | originalASS: | ||
+ | |||
+ | '''''{\1c&HF5F6FA&}{\t(0,100,\1c&H0000FF&}{\t(100,200,\1c&H00FF00)}{\t(400,700,\1c&HFBBB00)}'''''{\k10}u{\k21}so {\k35}ma{\k15}te{\k32}ta {\k31}mu{\k24}ne {\k23}no {\k14}o{\k27}to | ||
+ | |||
+ | outASS: | ||
+ | |||
+ | {Color 1 = '''''F5F6FA'''''}u | ||
+ | |||
+ | {Color 1 = '''''0000FF'''''}so | ||
+ | |||
+ | {Color 1 = '''''00FF00'''''}ma | ||
+ | |||
+ | {Color 1 = '''''D9C400'''''}te | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}ta | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}mu | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}ne | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}no | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}o | ||
+ | |||
+ | {Color 1 = '''''FBBB00'''''}to | ||
+ | ==Texindex Store== | ||
| ''lines'' ''' TEXTINDEX STORE '(' expr ')' '\n' ''' { TextindexStore( $5.value ); } | | ''lines'' ''' TEXTINDEX STORE '(' expr ')' '\n' ''' { TextindexStore( $5.value ); } | ||
Zeile 62: | Zeile 99: | ||
TEXTINDEX STORE (1) | TEXTINDEX STORE (1) | ||
''' | ''' | ||
+ | |||
+ | ==Textindex Get== | ||
| ''lines'' ''' TEXTINDEX GET '(' expr ')' '\n' ''' { TextindexGet( $5.value ); } | | ''lines'' ''' TEXTINDEX GET '(' expr ')' '\n' ''' { TextindexGet( $5.value ); } | ||
Zeile 71: | Zeile 110: | ||
''' | ''' | ||
+ | ==Randomins (defekt!)== | ||
| ''lines'' ''' RANDOMINS STRING expr '\n' ''' { rand_ins( $3.name, $4.value ); } | | ''lines'' ''' RANDOMINS STRING expr '\n' ''' { rand_ins( $3.name, $4.value ); } | ||
− | + | '''Ist definitiv DEFEKT und kann nicht verwendet werden!''' | |
+ | Die Funktion soll einen Zufallstext liefern, der Y Zeichen lang ist mit Buchstaben aus X. | ||
+ | |||
+ | '''<u>Beispiel:</u>''' | ||
+ | |||
+ | randomins( X , Y ) | ||
+ | |||
+ | randomins( "abcd", 3 ) | ||
+ | |||
+ | ''=> "adc", "bcd", "cad", ...'' | ||
+ | |||
+ | ==Stylelock== | ||
| ''lines'' ''' STYLELOCK IDENTIFIER '\n' ''' { if( !stylelock_identifier( $3.name ) )return EXIT_SUCCESS; } | | ''lines'' ''' STYLELOCK IDENTIFIER '\n' ''' { if( !stylelock_identifier( $3.name ) )return EXIT_SUCCESS; } | ||
Diese Funktion funktioniert im Header und muss dort auch vorhanden sein (alternativ TEXTLOCK). Sie gibt an, auf welchen Style der aktuelle P-Layer zugreifen soll. Stylelock steht in pX.txt und pXh.txt ganz oben in der Datei. Es kann sein, dass man den Stylelock nur im Header benötigt, aber wenn man keine Lust hat auf unvorhersehbare Fehlermeldungen, sollte man sich angewöhnen einfach immer in jedem Layer in 2 Dateien einen Stylelock stehen zu haben. | Diese Funktion funktioniert im Header und muss dort auch vorhanden sein (alternativ TEXTLOCK). Sie gibt an, auf welchen Style der aktuelle P-Layer zugreifen soll. Stylelock steht in pX.txt und pXh.txt ganz oben in der Datei. Es kann sein, dass man den Stylelock nur im Header benötigt, aber wenn man keine Lust hat auf unvorhersehbare Fehlermeldungen, sollte man sich angewöhnen einfach immer in jedem Layer in 2 Dateien einen Stylelock stehen zu haben. | ||
+ | |||
+ | Auf Nachfrage beim Hersteller, bekam ich noch folgenden Hinweis: | ||
+ | |||
+ | |||
+ | ''Frage: Kann man mehrere stylelocks in einem p-Layer verwenden um mehrere Positionen zu erreichnen von verschiedenen Styles?'' | ||
+ | |||
+ | stylelock bla | ||
+ | |||
+ | curx berechnen | ||
+ | |||
+ | stylelock bl2 | ||
+ | |||
+ | anderes curx berechnen | ||
+ | |||
+ | |||
+ | ''Antwort: Nein. Wenn der Stylelock nicht passt, beendet er die aktuelle Datei.'' | ||
+ | |||
'''<u>Beispiel:</u> | '''<u>Beispiel:</u> | ||
Zeile 84: | Zeile 152: | ||
''' | ''' | ||
− | + | ==Textlock== | |
| ''lines'' ''' TEXTLOCK IDENTIFIER '\n' ''' { if( !textlock_identifier( $3.name ) )return EXIT_SUCCESS; } | | ''lines'' ''' TEXTLOCK IDENTIFIER '\n' ''' { if( !textlock_identifier( $3.name ) )return EXIT_SUCCESS; } | ||
Zeile 95: | Zeile 163: | ||
''' | ''' | ||
− | + | ==Textfind== | |
| ''lines'' ''' TEXTFIND IDENTIFIER '\n' ''' { if( !textfind_identifier( $3.name ) )return EXIT_SUCCESS; } | | ''lines'' ''' TEXTFIND IDENTIFIER '\n' ''' { if( !textfind_identifier( $3.name ) )return EXIT_SUCCESS; } | ||
Zeile 114: | Zeile 182: | ||
''' | ''' | ||
− | + | ==!Textfind (negative)== | |
− | + | ||
| ''lines'' ''' '!' TEXTFIND IDENTIFIER '\n' ''' { if( textfind_identifier( $4.name ) )return EXIT_SUCCESS; } | | ''lines'' ''' '!' TEXTFIND IDENTIFIER '\n' ''' { if( textfind_identifier( $4.name ) )return EXIT_SUCCESS; } | ||
Zeile 126: | Zeile 193: | ||
''' | ''' | ||
+ | ==Prints (String)== | ||
| ''lines'' ''' PRINTS STRING '\n' ''' { printf( "%s", $3.name ); } | | ''lines'' ''' PRINTS STRING '\n' ''' { printf( "%s", $3.name ); } | ||
Zeile 136: | Zeile 204: | ||
" | " | ||
''' | ''' | ||
+ | |||
+ | ==Printv (Variable)== | ||
| ''lines'' ''' PRINTV expr '\n' ''' { printf( "%f", $3.value ); } | | ''lines'' ''' PRINTV expr '\n' ''' { printf( "%f", $3.value ); } | ||
Zeile 143: | Zeile 213: | ||
PRINTV Variablenname | PRINTV Variablenname | ||
''' | ''' | ||
+ | |||
+ | ==Coloring_Off (Colorchange Funktion)== | ||
| ''lines'' ''' COLORING_OFF '(' expr ',' expr ')' '\n' ''' { ColoringOff( $4.value, $6.value ); } | | ''lines'' ''' COLORING_OFF '(' expr ',' expr ')' '\n' ''' { ColoringOff( $4.value, $6.value ); } | ||
Fügt Colorchanges in die jeweilige Stelle ein. Diese Funktion ist sehr komplex und schwierig zu vermitteln. Deswegen etwas ausführlicher. | Fügt Colorchanges in die jeweilige Stelle ein. Diese Funktion ist sehr komplex und schwierig zu vermitteln. Deswegen etwas ausführlicher. | ||
+ | |||
Man beginnt damit, im Originalscript Farbwechsel zum Bild zu timen / einzufügen. Dabei sind folgende Regeln zu beachten: | Man beginnt damit, im Originalscript Farbwechsel zum Bild zu timen / einzufügen. Dabei sind folgende Regeln zu beachten: | ||
+ | |||
* Jede Farbe (1/2/3/4) muss einzelnd getimed werden {\t(100,200,\1c&HFF00FF)}{\t(100,200,\3c&HFF00FF)} | * Jede Farbe (1/2/3/4) muss einzelnd getimed werden {\t(100,200,\1c&HFF00FF)}{\t(100,200,\3c&HFF00FF)} | ||
+ | |||
* Harte Farbwechsel wie bei Szenenwechseln üblich sollten immer mit der Zeit der Startframes anfangen und mit der des Endframes aufhören, da es sonst zu verschiebungen um 1 Frame kommen kann, wenn man nur 1 bis 2 ms transfomiert. Hierbei rundert der VSFilter einfach selber ab und enscheidet sich meißt falsch... | * Harte Farbwechsel wie bei Szenenwechseln üblich sollten immer mit der Zeit der Startframes anfangen und mit der des Endframes aufhören, da es sonst zu verschiebungen um 1 Frame kommen kann, wenn man nur 1 bis 2 ms transfomiert. Hierbei rundert der VSFilter einfach selber ab und enscheidet sich meißt falsch... | ||
+ | |||
* Eine Startfarbe für die Line wird OHNE \t() eingefügt {\1c&HFF00FF}{\3c&HFF00FF} ansonsten wird die Stylefarbe als Startzeit immer eingefügt. | * Eine Startfarbe für die Line wird OHNE \t() eingefügt {\1c&HFF00FF}{\3c&HFF00FF} ansonsten wird die Stylefarbe als Startzeit immer eingefügt. | ||
+ | |||
Als nächstes fügt man in seinen Code den COLORING_OFF() Befehl ein. Dieser hat zwei Wertangaben, die Farbnummer und die Startzeitverschiebung / Startzeitanpassung. COLORING_OFF(1,wtstart) zum Beipspiel. Dies würde bedeuten, dass er die Colorchanges genau so einfügt, wie wir sie getimet haben im Originalscript. | Als nächstes fügt man in seinen Code den COLORING_OFF() Befehl ein. Dieser hat zwei Wertangaben, die Farbnummer und die Startzeitverschiebung / Startzeitanpassung. COLORING_OFF(1,wtstart) zum Beipspiel. Dies würde bedeuten, dass er die Colorchanges genau so einfügt, wie wir sie getimet haben im Originalscript. | ||
Zeile 172: | Zeile 249: | ||
''' | ''' | ||
+ | ==Borderline== | ||
| ''lines'' ''' BORDERLINE '(' expr ',' expr ')' '\n' ''' { PrintBorderline( $4.value, $6.value ); } | | ''lines'' ''' BORDERLINE '(' expr ',' expr ')' '\n' ''' { PrintBorderline( $4.value, $6.value ); } | ||
kommt später, ist zu Komplex für mal eben | kommt später, ist zu Komplex für mal eben | ||
+ | ==Killthisloop== | ||
| ''lines'' ''' KILLTHISLOOP '\n' ''' { KillThisLoop(); } | | ''lines'' ''' KILLTHISLOOP '\n' ''' { KillThisLoop(); } | ||
Beendet einen loopfile vorzeitigt. Dabei ist es egal wo der Text steht, der Loop wird trotzdem bis zum Ende durchlaufen und dann erst ausgesetzt. Die ist praktisch, wenn man beim generieren der Line z.B. nur ein Endwert bekannt ist, und man so oft loop, bis dieser überschritten ist und dann den Loop beendet und den Wert abspeichert etc. | Beendet einen loopfile vorzeitigt. Dabei ist es egal wo der Text steht, der Loop wird trotzdem bis zum Ende durchlaufen und dann erst ausgesetzt. Die ist praktisch, wenn man beim generieren der Line z.B. nur ein Endwert bekannt ist, und man so oft loop, bis dieser überschritten ist und dann den Loop beendet und den Wert abspeichert etc. | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
LOWKILL(meinloop,wtend) | LOWKILL(meinloop,wtend) | ||
KILLTHISLOOP | KILLTHISLOOP | ||
''' | ''' | ||
+ | |||
+ | |||
+ | ==Lowkill (if Ersatz)== | ||
| ''lines'' ''' LOWKILL '(' expr ',' expr ')' '\n' ''' { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value); | | ''lines'' ''' LOWKILL '(' expr ',' expr ')' '\n' ''' { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value); | ||
return EXIT_SUCCESS;}else printf( "lowkill no %f>=%f\n",$4.value,$6.value); } | return EXIT_SUCCESS;}else printf( "lowkill no %f>=%f\n",$4.value,$6.value); } | ||
Zeile 190: | Zeile 272: | ||
LOWKILL ist eine Art if-Abfrage, welche aber eine feste Bedingung stellt und zwar 1. Variable ist größergleich 2. Variable. Wenn dieser Fall eintrifft, ist der LOWKILL() True und greift ein. Es gilt das gleiche Prinzip wqie bei Textfind, wenn der LOWKILL Yes ist, wird der nachfolgende Code '''<u>NICHT</u>''' ausgeführt. Wenn die Bedingung nicht erfüllt ist, ist der LOWKILL NO und der nachfolgende Code wird ausgeführt. Der LOWKILL hat die Eigenschaft die gestellte Bedingung mit den aktuellen Werten und einem YES/NO im Comnsolemnfenster auszugeben. Kombiniert man dies mit PRINTS"" weiß man immer ungefähr, welcher Lowkill gerade ausgeführt wurde. Da LOWKILLS nicht übersprungen werden können, so wie if-Abfragen, kann man diese auch in extra TXT Dateien auslagern, um dort zu prüfen, ob die Bedingung erfüllt wurde oder nicht und diesen Wert dann zu speichern und später zu benutzen. | LOWKILL ist eine Art if-Abfrage, welche aber eine feste Bedingung stellt und zwar 1. Variable ist größergleich 2. Variable. Wenn dieser Fall eintrifft, ist der LOWKILL() True und greift ein. Es gilt das gleiche Prinzip wqie bei Textfind, wenn der LOWKILL Yes ist, wird der nachfolgende Code '''<u>NICHT</u>''' ausgeführt. Wenn die Bedingung nicht erfüllt ist, ist der LOWKILL NO und der nachfolgende Code wird ausgeführt. Der LOWKILL hat die Eigenschaft die gestellte Bedingung mit den aktuellen Werten und einem YES/NO im Comnsolemnfenster auszugeben. Kombiniert man dies mit PRINTS"" weiß man immer ungefähr, welcher Lowkill gerade ausgeführt wurde. Da LOWKILLS nicht übersprungen werden können, so wie if-Abfragen, kann man diese auch in extra TXT Dateien auslagern, um dort zu prüfen, ob die Bedingung erfüllt wurde oder nicht und diesen Wert dann zu speichern und später zu benutzen. | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
meinloop=meinloop+1 | meinloop=meinloop+1 | ||
Zeile 197: | Zeile 279: | ||
''' | ''' | ||
+ | ==Fontmatch use== | ||
| ''lines'' ''' FONTMATCHUSE STRING '\n' ''' { fontmatchuse( $3.name ); } | | ''lines'' ''' FONTMATCHUSE STRING '\n' ''' { fontmatchuse( $3.name ); } | ||
Setzt die für die Position und Pixelberechnung von Calc die Font, welche verwendet werden soll. Normalerweise will man die Font des gelockten Styles verwenden, aber in Sonderfällen kann dies sehr sinnvoll sein. Muss in der pXh.txt benutzt werden, da dies für die weiteren Berechnungen benötigt wird. | Setzt die für die Position und Pixelberechnung von Calc die Font, welche verwendet werden soll. Normalerweise will man die Font des gelockten Styles verwenden, aber in Sonderfällen kann dies sehr sinnvoll sein. Muss in der pXh.txt benutzt werden, da dies für die weiteren Berechnungen benötigt wird. | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
fontmatch use "auto" | fontmatch use "auto" | ||
Zeile 207: | Zeile 290: | ||
fontmatch use "Arial" | fontmatch use "Arial" | ||
''' | ''' | ||
+ | |||
+ | ==Set flag== | ||
| ''lines'' ''' SETFLAG STRING '\n' ''' { set_flag( $3.name ); } | | ''lines'' ''' SETFLAG STRING '\n' ''' { set_flag( $3.name ); } | ||
Die dritte wichtige Funktion für die pXh.txt Datei. Diese setzt die Art und Weise, wie ASSCalc die pX.txt loopen soll, bzw. wie es eine Line abarbeiten soll. Es gibt 5 Flags, welche gesetzt werden können: | Die dritte wichtige Funktion für die pXh.txt Datei. Diese setzt die Art und Weise, wie ASSCalc die pX.txt loopen soll, bzw. wie es eine Line abarbeiten soll. Es gibt 5 Flags, welche gesetzt werden können: | ||
− | * charwise | + | |
+ | ===* charwise=== | ||
+ | |||
:: Berechnet die Line pro Zeichen/Char/Buchstabe. Das heißt, die pX.txt Datei wird pro Zeichen (auch Leerzeichen) 1x ausgeführt. In dieser können dann wieder mit loopfiles undendlich viele weitere Dateien pro Zeichen aufgerufen werden. | :: Berechnet die Line pro Zeichen/Char/Buchstabe. Das heißt, die pX.txt Datei wird pro Zeichen (auch Leerzeichen) 1x ausgeführt. In dieser können dann wieder mit loopfiles undendlich viele weitere Dateien pro Zeichen aufgerufen werden. | ||
− | * doublecharwise | + | |
+ | ===* doublecharwise=== | ||
+ | |||
:: Für SHIFT-J Berechnung. Zwei Zeichen werden immer als eine Position behandelt, da SHIFT-J ein UTF8 Zeichen mit zwei Zeichen beschreiben muss. Durch die neue UTF8 unterstützung ist dieser FLAG eher nutzlos geworden. | :: Für SHIFT-J Berechnung. Zwei Zeichen werden immer als eine Position behandelt, da SHIFT-J ein UTF8 Zeichen mit zwei Zeichen beschreiben muss. Durch die neue UTF8 unterstützung ist dieser FLAG eher nutzlos geworden. | ||
− | * spacefix | + | |
+ | ===* spacefix=== | ||
+ | |||
:: Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt. Ähnlich wie Skispace, aber keine genaueren Infos vorhanden. Bitte updaten. | :: Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt. Ähnlich wie Skispace, aber keine genaueren Infos vorhanden. Bitte updaten. | ||
− | * skipspace | + | |
+ | ===* skipspace=== | ||
+ | |||
:: Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt. | :: Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt. | ||
− | * no_k_ins | + | |
+ | ===* no_k_ins=== | ||
+ | |||
:: keine Beschreibung vorhanden, bitte Updaten. | :: keine Beschreibung vorhanden, bitte Updaten. | ||
Wenn kein Flag angegeben ist, wird automatisch skipspace benutzt. Pro Effekt Layer kann nur 1 Flag benutzt werden. 2 Effekt Layer mit verschiedenen Flags sollten von der Position fast exakt übereinander liegen und können durch abspeichern der Posaition und des Textes auch in einem Layer benutzt werden. | Wenn kein Flag angegeben ist, wird automatisch skipspace benutzt. Pro Effekt Layer kann nur 1 Flag benutzt werden. 2 Effekt Layer mit verschiedenen Flags sollten von der Position fast exakt übereinander liegen und können durch abspeichern der Posaition und des Textes auch in einem Layer benutzt werden. | ||
− | + | ===Beispiel:=== | |
set flag "charwise" | set flag "charwise" | ||
''' | ''' | ||
+ | ==time of== | ||
| ''lines'' ''' TIMEOF expr '\n' ''' { print_time_of( $3.value ); } | | ''lines'' ''' TIMEOF expr '\n' ''' { print_time_of( $3.value ); } | ||
Gibt eine Zahl als ASS Timecode aus und schreibt ihn in die out.ass. Dies wird für die Zeiten der eigentlichen Line benötigt. | Gibt eine Zahl als ASS Timecode aus und schreibt ihn in die out.ass. Dies wird für die Zeiten der eigentlichen Line benötigt. | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
time of 5 | time of 5 | ||
Zeile 238: | Zeile 334: | ||
out.ass: 0:00:5.00 | out.ass: 0:00:5.00 | ||
''' | ''' | ||
+ | |||
+ | ==pos of== | ||
| ''lines'' ''' POSOF expr '\n' ''' { print_pos_of( $3.value ); } | | ''lines'' ''' POSOF expr '\n' ''' { print_pos_of( $3.value ); } | ||
− | Gibt eine Zahl genau so aus, wie sie im Script steht und schreibt sie in die out.ass. Wie oben schon erwähnt arbeitet Calc in Milisekunden. Somit wäre eine 1 im Script eine 1000 in der out.ass. Mit pos of 1 bleibt die Zahl auch in der out.ass 1. Dies ist bei Positionsangaben oder sonstigen Ganzzahlen sinnvoll, die man | + | Gibt eine Zahl genau so aus, wie sie im Script steht und schreibt sie in die out.ass. Wie oben schon erwähnt arbeitet Calc in Milisekunden. Somit wäre eine 1 im Script eine 1000 in der out.ass. Mit pos of 1 bleibt die Zahl auch in der out.ass 1. Dies ist bei Positionsangaben oder sonstigen Ganzzahlen sinnvoll, die man sonst durch /1000 teilen müsste. |
− | '''<u>Beispiel:<u> | + | |
+ | POS OF rundet nach dem korrekten mathematischen Rundungssystem (fast ^^) d.h. es beachtet die 1. Kommastelle und rundet auf bei > 5 auf oder < 5 ab. | ||
+ | |||
+ | |||
+ | '''''Für das Abschneiden der Kommastellen siehe auch TRUNC() unter [[Asscalc Expressions]].''''' | ||
+ | |||
+ | |||
+ | '''<u>Beispiel:</u> | ||
pos of curx | pos of curx | ||
out.ass: 351 | out.ass: 351 | ||
+ | |||
pos of 5 | pos of 5 | ||
out.ass: 5 | out.ass: 5 | ||
+ | |||
+ | |||
+ | pos of 5.4999 | ||
+ | |||
+ | out.ass: 5 | ||
+ | |||
+ | ''Hinweis: bei einer korrekten mathematischen Rundung, hätte 6 rauskommen müssen, da alle Kommastellen beachtet werden und nicht nur die erste!'' | ||
+ | |||
+ | |||
+ | pos of 5.5 | ||
+ | |||
+ | out.ass: 6 | ||
+ | |||
+ | |||
''' | ''' | ||
+ | |||
+ | ==hex of== | ||
| ''lines'' ''' HEXOF expr '\n' ''' { print_hex_of( $3.value ); } | | ''lines'' ''' HEXOF expr '\n' ''' { print_hex_of( $3.value ); } | ||
Wandelt eine Ganzzahl in einen Hexwert um und schreibt diesen in die die out.ass. Dieser Vorgang kann nicht umgekehrt werden (Hex->Dezimal). Dabei sollte man beachten, dass ASS nur bis max. 255 -> FF Arbeitet, sprich schaut euch MIN() und MAX() an ;) | Wandelt eine Ganzzahl in einen Hexwert um und schreibt diesen in die die out.ass. Dieser Vorgang kann nicht umgekehrt werden (Hex->Dezimal). Dabei sollte man beachten, dass ASS nur bis max. 255 -> FF Arbeitet, sprich schaut euch MIN() und MAX() an ;) | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
hex of 255 | hex of 255 | ||
Zeile 262: | Zeile 384: | ||
out.ass: ff | out.ass: ff | ||
''' | ''' | ||
+ | |||
+ | ==char of== | ||
| ''lines'' ''' CHAROF expr '\n' ''' { print_char_of( $3.value ); } | | ''lines'' ''' CHAROF expr '\n' ''' { print_char_of( $3.value ); } | ||
− | Gibt das zur angegebenen Zahl zugehörige ANSI Zeichen aus und schreibt es in die out.ass. Die einzigste Möglichkeit um dynamischen Text zu erzeugen, aber sehr aufwändig.... | + | Gibt das zur angegebenen Zahl zugehörige ANSI/UTF8 Zeichen (je nachdem ob ASSCalc V1 oder V2 benutzt wird) aus und schreibt es in die out.ass. Die einzigste Möglichkeit um dynamischen Text zu erzeugen, aber sehr aufwändig.... |
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
char of 11 | char of 11 | ||
Zeile 281: | Zeile 405: | ||
out.ass: {charof ��!,7BMXc�} | out.ass: {charof ��!,7BMXc�} | ||
''' | ''' | ||
+ | |||
+ | ==color of== | ||
| ''lines'' ''' COLOROF expr '\n' ''' { print_color_of( $3.value ); } | | ''lines'' ''' COLOROF expr '\n' ''' { print_color_of( $3.value ); } | ||
Zeile 286: | Zeile 412: | ||
Wenn ihr eine Farbe áus ASS Code in eine Dezimalzahl umrechnet wollt, benutzt ihr am besten den Windows Calc o.Ä. und gebt dort euren Hexwert ein, dann auf Dezimal drücken und man hat seinen Wert ;) | Wenn ihr eine Farbe áus ASS Code in eine Dezimalzahl umrechnet wollt, benutzt ihr am besten den Windows Calc o.Ä. und gebt dort euren Hexwert ein, dann auf Dezimal drücken und man hat seinen Wert ;) | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
color of 16593954 | color of 16593954 | ||
Zeile 296: | Zeile 422: | ||
out.ass: 000005 | out.ass: 000005 | ||
''' | ''' | ||
+ | |||
+ | ==tval of== | ||
| ''lines'' ''' TVALOF expr '\n' ''' { print_tval_of( $3.value ); } | | ''lines'' ''' TVALOF expr '\n' ''' { print_tval_of( $3.value ); } | ||
− | Gibt eine Zahl mit dem Faktor 1000 aus und schreibt sie in die out.ass. Dies entspricht der Standardausgabe von Calc und ist nur der Vollständigkeitshalber vorhanden. Es reicht auch nur die Variable ins Script zu schreiben. | + | Gibt eine Zahl mit dem Faktor 1000 aus und schreibt sie in die out.ass. Dies entspricht der Standardausgabe von Calc und ist nur der Vollständigkeitshalber vorhanden. Es reicht auch nur die Variable ins Script zu schreiben. |
− | '''<u>Beispiel:<u> | + | |
+ | TVAL OF rundet nach dem korrekten mathematischen Rundungssystem (fast ^^) d.h. es beachtet die 1. Zahl nach der definierten Ausgabenanzahl und rundet auf bei > 5 auf oder < 5 ab. Normalerweise werden durch die 1000er Faktorisierung immer die Ganzzahl und 3 Kommastellen beachtet. Daraus ergibt sich beim multiplizieren mit x1000 dann z.B. 1234 bei ''var = 1.234''. Hat man nun eine weitere Zahl, tritt das rundungsystem automatisch in Kraft z.B. 1235 bei ''var = 1.2345''. Erhöht sich die Zahl auf 10, ergänzt ASSCalc die vorherigen Stellen z.B. 1500 bei ''var = 1.4999''. | ||
+ | |||
+ | |||
+ | '''''Für das Abschneiden der Kommastellen siehe auch TRUNC() unter [[Asscalc Expressions]].''''' | ||
+ | |||
+ | |||
+ | '''<u>Beispiel:</u> | ||
tval of 1 | tval of 1 | ||
out.ass: 1000 | out.ass: 1000 | ||
+ | |||
tval of 0.1 | tval of 0.1 | ||
out.ass: 100 | out.ass: 100 | ||
+ | |||
tval of 0.01 | tval of 0.01 | ||
out.ass: 10 | out.ass: 10 | ||
+ | |||
tval of 0.001 | tval of 0.001 | ||
out.ass: 1 | out.ass: 1 | ||
+ | |||
+ | |||
+ | tval of 1.499 | ||
+ | |||
+ | out.ass: 1499 | ||
+ | |||
+ | |||
+ | tval of 1.4999 | ||
+ | |||
+ | out.ass: 1500 | ||
+ | |||
+ | |||
+ | tval of 1.49949 | ||
+ | |||
+ | out.ass: 1499 | ||
+ | |||
+ | ''Hinweis: bei einer korrekten mathematischen Rundung, hätte 1500 rauskommen müssen, da alle Kommastellen beachtet werden und nicht nur die als nächstes folgende!'' | ||
+ | |||
+ | |||
+ | tval of 1.123 | ||
+ | |||
+ | out.ass: 1123 | ||
+ | |||
+ | |||
+ | tval of 1.1204 | ||
+ | |||
+ | out.ass: 1120 | ||
+ | |||
+ | |||
+ | tval of 1.2305 | ||
+ | |||
+ | out.ass: 1231 | ||
+ | |||
+ | |||
+ | tval of 1.23045 | ||
+ | |||
+ | out.ass: 1230 | ||
+ | |||
''' | ''' | ||
+ | |||
+ | ==Loopfile== | ||
| ''lines'' ''' LOOPFILE STRING expr '\n' ''' { loop_file( $3.name, $4.value, 1 ); } | | ''lines'' ''' LOOPFILE STRING expr '\n' ''' { loop_file( $3.name, $4.value, 1 ); } | ||
Führt eine angegebene TXT Datei n mal aus. Die Datei wird dabei immer an die aktuelle angehängt. Das bedeutet es ist egal wo der loopfile steht, er wird erst ausgeführt, wenn die aktuelle Datei komplett durchlaufen wurde z.B. wenn ein Loopfile in der p1.txt steht weit oben steht, wird dieser erst nach der p1 ausgeführt und unten dran gehängt. Selbst wenn man noch in der p1 nach dem Loopfile Variablenanpassungen vornimmt, wird er diese auch schon benutzen. Ist etwas unlogisch, aber teilweise auch praktisch. | Führt eine angegebene TXT Datei n mal aus. Die Datei wird dabei immer an die aktuelle angehängt. Das bedeutet es ist egal wo der loopfile steht, er wird erst ausgeführt, wenn die aktuelle Datei komplett durchlaufen wurde z.B. wenn ein Loopfile in der p1.txt steht weit oben steht, wird dieser erst nach der p1 ausgeführt und unten dran gehängt. Selbst wenn man noch in der p1 nach dem Loopfile Variablenanpassungen vornimmt, wird er diese auch schon benutzen. Ist etwas unlogisch, aber teilweise auch praktisch. | ||
− | '''<u>Beispiel:<u> | + | '''<u>Beispiel:</u> |
loopfile "p1 in.txt" 1 | loopfile "p1 in.txt" 1 | ||
Zeile 328: | Zeile 506: | ||
loopfile "effekt.txt" variablenname | loopfile "effekt.txt" variablenname | ||
''' | ''' | ||
+ | |||
+ | ==Loopfile2== | ||
| ''lines'' ''' LOOPFILE2 STRING '(' expr ',' expr ')' '\n' ''' { loop_file( $3.name, $5.value, $7.value ); } | | ''lines'' ''' LOOPFILE2 STRING '(' expr ',' expr ')' '\n' ''' { loop_file( $3.name, $5.value, $7.value ); } | ||
Zeile 333: | Zeile 513: | ||
Es gibt 2 feste Variablen die in einem Loopfile2 mit generiert werden: ''loopvar'' und ''loopvar2''. | Es gibt 2 feste Variablen die in einem Loopfile2 mit generiert werden: ''loopvar'' und ''loopvar2''. | ||
+ | |||
* ''loopvar'' ist im ersten X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird | * ''loopvar'' ist im ersten X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird | ||
+ | |||
* ''loopvar2'' ist im ersten Y Achsendurchlauf Yposloop 0 -> +nSilbenhöhe -> Ende Y => loopvar2 gibt den aktuellen Y Wert zurück, sprich zählt automatisch +1 pro Loopdurchlauf und wird bei erreichen der Silbenhöhe auf 0 zurück gesetzt. | * ''loopvar2'' ist im ersten Y Achsendurchlauf Yposloop 0 -> +nSilbenhöhe -> Ende Y => loopvar2 gibt den aktuellen Y Wert zurück, sprich zählt automatisch +1 pro Loopdurchlauf und wird bei erreichen der Silbenhöhe auf 0 zurück gesetzt. | ||
− | '''<u>Beispiel:<u> | + | |
+ | '''<u>Beispiel:</u> | ||
* loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy)) | * loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy)) | ||
+ | |||
* entspricht loopfile2 "p1 in.txt" ((EndeX - AnfangX),(EndeY - AnfangY)) | * entspricht loopfile2 "p1 in.txt" ((EndeX - AnfangX),(EndeY - AnfangY)) | ||
+ | |||
* entspricht Matrix aus (Silbenbreite,Silbenhöhe)''' | * entspricht Matrix aus (Silbenbreite,Silbenhöhe)''' | ||
+ | ==Exit== | ||
| ''lines'' ''' EXIT '\n' ''' { return EXIT_SUCCESS; } | | ''lines'' ''' EXIT '\n' ''' { return EXIT_SUCCESS; } | ||
Bitte Updaten. Warscheinlich ähnlich wie KILLTHISLOOP | Bitte Updaten. Warscheinlich ähnlich wie KILLTHISLOOP | ||
+ | ==Empty== | ||
| '''/* empty */ ''' | | '''/* empty */ ''' | ||
− | + | Kurz und knackig von Tentacle: "Das ist ne programmiertechnische Eigenart, die dem Kompiler sagt, dass leere zZeilen nicht zwangsweise ein fehler sind ..." | |
+ | ==Error== | ||
| '''error '\n' ''' { printf("\n error \n"); yyerrok; } | | '''error '\n' ''' { printf("\n error \n"); yyerrok; } | ||
Bitte updaten. | Bitte updaten. |
Aktuelle Version vom 8. Juni 2013, 09:58 Uhr
Commandos in ASSCalc können als feste Funktionen angesehen werden. Sie können für verschiedene Zwecke eingesetzt werden, haben aber auch gewisse Macken, welche man kennen sollte, aber seht selbst ;) Grundsätzlich beziehen sich diese Funktionen auf die "lines", d.h. sie sind dafür ausgelegt im P Layer benutzt zu werden, im Header funktionieren sie meißt falsch oder eher gar nicht.
Inhaltsverzeichnis
- 1 Ausgabe einer Variable
- 2 Ausgabe eines Strings
- 3 Variable setzen/definieren
- 4 Ausgabe von (fester Script-) Variable
- 5 Texindex Store
- 6 Textindex Get
- 7 Randomins (defekt!)
- 8 Stylelock
- 9 Textlock
- 10 Textfind
- 11 !Textfind (negative)
- 12 Prints (String)
- 13 Printv (Variable)
- 14 Coloring_Off (Colorchange Funktion)
- 15 Borderline
- 16 Killthisloop
- 17 Lowkill (if Ersatz)
- 18 Fontmatch use
- 19 Set flag
- 20 time of
- 21 pos of
- 22 hex of
- 23 char of
- 24 color of
- 25 tval of
- 26 Loopfile
- 27 Loopfile2
- 28 Exit
- 29 Empty
- 30 Error
Ausgabe einer Variable
| lines expr '\n' { print_tval_of( $2.value );/*fprintf( foutt, "%.12g", $2.value) */}
Die Grundfunktion, wie eine Variable in Calc ausgegeben wird. Das lines bezieht sich auf den Teil in dem die Funktion steht (nicht im Header). expr ist die Bezeichnung für Variable. Hier kann alles stehen, aber man sollte Zahlen vermeiden. Sonderzeichen und nicht englischsprachige Zeichen sind Tabu. \n bedeutet, dass immer eine weitere Leerzeile benötigt wird. Diese kann auch am Scriptende stehen, aber muss vorhanden sein, sonst hagelt es nur Fehler. Wichtig ist auch zu wissen, dass Variablen nur Zahlen sein können und diese bei der Ausgabe um den Faktor 1000 multipliziert werden, da ASSCalc in milisekunden rechnet. Für eine modifizierte Ausgabe, einfach unten weiter lesen (pos of, hex of etc.)
Beispiel:
variablenname
Ausgabe eines Strings
| lines STRING '\n' { fprintf( foutt, "%s", $2.name) }
Fügt einen String in die out.ass ein. Wie in anderen Programmiersprachen muss ein String in "" stehen. Strings und Variablenausgaben können NICHT in einer Codezeile kombiniert werden. Alles was als String angegeben wurde, kann in die out.ass geschrieben werden, auch Sonderzeichen. Eine neue Line wird in der out.ass Erzeugt indem man " + ENTER + " benutzt (siehe Beispiel unten).
Beispiel:
"{\t(0,200,\1c&HFFFFFF&)}"
"{\t(0," tstart-wtstart ")}"
"
Dialog: "
Variable setzen/definieren
| lines IDENTIFIER '=' expr '\n' { set_identifier( $2, $4.value ); }
==Array setzen/definieren
| lines IDENTIFIER '[' expr ']' '=' expr '\n' { set_identifier_arr( $2, $7.value, $4.value ); }
Ausgabe von (fester Script-) Variable
| lines INSERT IDENTIFIER '\n' { print_identifier( $3.name ); }
Fügt Daten aus dem Grundscript in die out.ass ein. Bisher wird dies für Farben und Text/Zeichen/Silbe benötigt. Diese Daten können nicht verarbeitet werden, sondern nur direkt eingefügt werden, sozusagen CopyPasta ;)
Beispiel:
insert text fügt die aktuelle Silbe oder Text ein, je nach Berechnungsart
insert text_all fügt die ganze Line als Text ein
insert text_copy fügt die ganze Line aus dem Originalscript ein, incl. \ass Tags und sonstigem Code welcher in der Line steht
insert stylecolor1 fügt die Primary Farbe des gelockten Styles ein, gilt auch für die Secondary, Border und Shadowfarbe
insert stylecolor1.stylename fügt die Primary Farbe vom Style "stylename" ein, gilt auch für Secondary, Boder und Shadowfarbe
insert @stylecolor1 fügt den Farbwert ein, welcher an einem Zeitpunkt X vorhanden ist. Dies funktioniert natürlich nur mit vordefinierten Colorchanges im Original.ass. Für die Zeitdefinition wird eine zusätzliche feste Variable benötigt, mit dem Namen fetchtime. Will mam z.B. den Farbwert an tstart wissen, setzt man fetchtime = tstart und stylecolor1@ liefert den passenden Farbwert dazu.
Beispiel mit fetchtime = tstart
originalASS:
{\1c&HF5F6FA&}{\t(0,100,\1c&H0000FF&}{\t(100,200,\1c&H00FF00)}{\t(400,700,\1c&HFBBB00)}{\k10}u{\k21}so {\k35}ma{\k15}te{\k32}ta {\k31}mu{\k24}ne {\k23}no {\k14}o{\k27}to
outASS:
{Color 1 = F5F6FA}u
{Color 1 = 0000FF}so
{Color 1 = 00FF00}ma
{Color 1 = D9C400}te
{Color 1 = FBBB00}ta
{Color 1 = FBBB00}mu
{Color 1 = FBBB00}ne
{Color 1 = FBBB00}no
{Color 1 = FBBB00}o
{Color 1 = FBBB00}to
Texindex Store
| lines TEXTINDEX STORE '(' expr ')' '\n' { TextindexStore( $5.value ); }
Kann die aktuelle Silbe/Zeichen im aktuellen P-Layer Durchlauf in eine Variable schreiben. TEXTINDEX funktioniert hierbei als festes String Array in welches 255 Plätze besitzt.
Beispiel:
TEXTINDEX STORE (1)
Textindex Get
| lines TEXTINDEX GET '(' expr ')' '\n' { TextindexGet( $5.value ); }
Fügt den gespiechterten TEXT aus TEXTINDEX STORE () in die out.ass ein. Ist wie "insert text" zu behandeln und kann keine weitere modifikation oder umspeicherung in einen anderen Slot vorgenommen werden.
Beispiel:
TEXTINDEX GET (1)
Randomins (defekt!)
| lines RANDOMINS STRING expr '\n' { rand_ins( $3.name, $4.value ); }
Ist definitiv DEFEKT und kann nicht verwendet werden!
Die Funktion soll einen Zufallstext liefern, der Y Zeichen lang ist mit Buchstaben aus X.
Beispiel:
randomins( X , Y )
randomins( "abcd", 3 )
=> "adc", "bcd", "cad", ...
Stylelock
| lines STYLELOCK IDENTIFIER '\n' { if( !stylelock_identifier( $3.name ) )return EXIT_SUCCESS; }
Diese Funktion funktioniert im Header und muss dort auch vorhanden sein (alternativ TEXTLOCK). Sie gibt an, auf welchen Style der aktuelle P-Layer zugreifen soll. Stylelock steht in pX.txt und pXh.txt ganz oben in der Datei. Es kann sein, dass man den Stylelock nur im Header benötigt, aber wenn man keine Lust hat auf unvorhersehbare Fehlermeldungen, sollte man sich angewöhnen einfach immer in jedem Layer in 2 Dateien einen Stylelock stehen zu haben.
Auf Nachfrage beim Hersteller, bekam ich noch folgenden Hinweis:
Frage: Kann man mehrere stylelocks in einem p-Layer verwenden um mehrere Positionen zu erreichnen von verschiedenen Styles?
stylelock bla
curx berechnen
stylelock bl2
anderes curx berechnen
Antwort: Nein. Wenn der Stylelock nicht passt, beendet er die aktuelle Datei.
Beispiel:
stylelock japro
Textlock
| lines TEXTLOCK IDENTIFIER '\n' { if( !textlock_identifier( $3.name ) )return EXIT_SUCCESS; }
Funktioniert ähnlich wie Stylelock, aber benutzt den angegebenen Text als Identifier für seine Suche. Leider klappt dies nicht so richtig und wenn man Textlock in pX.txt und pXh.txt doppelt benutzt, scheint er keinen Zugriff auf die Text Variable zu´bekommen und gibt keinen Text aus und nur den Dialog vorher. => Bitte updaten, fals jemand bessere Erfahrungswerte damit gemacht hat.
Beispiel:
textlock bla
Textfind
| lines TEXTFIND IDENTIFIER '\n' { if( !textfind_identifier( $3.name ) )return EXIT_SUCCESS; }
Mit dieser Funktion kann nach TEXT in einer Line gesucht werden. Wird der Text gefunden, dann wird der Code nach Textfind ausgeführt, wenn nicht, wird er weg gelassen. Groß und Kleinschreibung wird beachtet. Zusätzlich ist es NICHT Silbenabhängig, das bedeutet, wenn der Text erst am Ende der Line steht, ist der Textfind trotzdem für jede Line TRUE. Als typisches Anwendungsbeispiel wäre wohl ein Event zu nennen. Wenn z.B. ein Extra Effekt nur für eine spezielle Line ausgeführt werden soll, oder man eine Variable für eine Line abändern will etc. Textfind geht nicht mit Sonderzeichen! Textfind findet jeden Text, dies gilt nicht nur für Silben. So können z.B. einfache Identifier wie {Q} {X} {FX1} in das Originalscript geschrieben werden und anhand dieser wird Textfind dann entweder ausgeführt oder nicht.
Beispiel:
Originalscript: {Q}{\k22}bla
textfind bla loopfile "special effect.txt" 1
oder
textfind Q loopfile "special effect.txt" 1
!Textfind (negative)
| lines '!' TEXTFIND IDENTIFIER '\n' { if( textfind_identifier( $4.name ) )return EXIT_SUCCESS; }
Die umkehrfunktion von TEXTFIND. Wenn ein Text NICHT gefunden wird in der ganze Line, wird der Code nach Textfind weiterhin ausgeführt. Typisches Anwendungsbeispiel wäre die Kombination mit Textfind und 2 Dateien als Loop. Eine Datei benötigt den Text um ausgeführt zu werden, die zweite wird nur ausgeführt, wenn der Text NICHT ausgeführt wird.
Beispiel:
!textfind Q loopfile "standard effect.txt" 1
Prints (String)
| lines PRINTS STRING '\n' { printf( "%s", $3.name ); }
Fügt einen String in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Absätze wie im Punkt Strings weiter oben können hier genau so genutzt werden, ansonsten werden sie als Fließtext eingefügt.
Beispiel:
PRINTS " Nein das ist kein fucking Hallo World Ausgabetext "
Printv (Variable)
| lines PRINTV expr '\n' { printf( "%f", $3.value ); }
Fügt eine Variable in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Werden als Fließtext eingefügt. Für eine bessere Übersicht und Absätze muss man die Funktion mit PRINTS kombinieren. Beispiel:
PRINTV Variablenname
Coloring_Off (Colorchange Funktion)
| lines COLORING_OFF '(' expr ',' expr ')' '\n' { ColoringOff( $4.value, $6.value ); }
Fügt Colorchanges in die jeweilige Stelle ein. Diese Funktion ist sehr komplex und schwierig zu vermitteln. Deswegen etwas ausführlicher.
Man beginnt damit, im Originalscript Farbwechsel zum Bild zu timen / einzufügen. Dabei sind folgende Regeln zu beachten:
- Jede Farbe (1/2/3/4) muss einzelnd getimed werden {\t(100,200,\1c&HFF00FF)}{\t(100,200,\3c&HFF00FF)}
- Harte Farbwechsel wie bei Szenenwechseln üblich sollten immer mit der Zeit der Startframes anfangen und mit der des Endframes aufhören, da es sonst zu verschiebungen um 1 Frame kommen kann, wenn man nur 1 bis 2 ms transfomiert. Hierbei rundert der VSFilter einfach selber ab und enscheidet sich meißt falsch...
- Eine Startfarbe für die Line wird OHNE \t() eingefügt {\1c&HFF00FF}{\3c&HFF00FF} ansonsten wird die Stylefarbe als Startzeit immer eingefügt.
Als nächstes fügt man in seinen Code den COLORING_OFF() Befehl ein. Dieser hat zwei Wertangaben, die Farbnummer und die Startzeitverschiebung / Startzeitanpassung. COLORING_OFF(1,wtstart) zum Beipspiel. Dies würde bedeuten, dass er die Colorchanges genau so einfügt, wie wir sie getimet haben im Originalscript.
Will man nun aber die Line bei wtstart (Startzeit der aktuellen Line) minus 300ms starten, würden alle Colorchanges nun 300ms zu früh erscheinen. Um dies zu korrigieren, rechnet die Colorchange Funktion selbständig die von uns getimeten Farbwechsel um und gibt diese aus, vorrausgesetzt man gibt dies an => COLORING_OFF(1,wtstart-0.3)
Sollte nun ein Colorchange nicht mehr in den Bereich der Silbe fallen, da die Startzeit später ist als der vorhandenen \t(), wird dieser von der Funktion einfach weg gelassen um Ausgabetext zu minimieren.
Nun sollte auch klar sein, warum die Startfarbe kein \t() bekommt. Wenn man dies einfügen würde und verschiebt nun die Line um -300ms würde die Colorchange Funktion nun alle im Originalscripot angegebenen \t() um +300ms verschieben. Wenn wir nun der Startfarbe ein \t(0,2,\1c&HFFFFFF&) zuweisen, würde diese auch verschoeben und die Line hätte dan welche Farbe für die ersten 300ms? Genau, die des vorhandenen Styles!
Beispiel (danke neo2011):
COLORING_OFF( <farbnummer>, <startzeitderzeile>) COLORING_OFF(1, wtstart) farbnummer: - 1 = foreground - 2 = 2nd foreground - 3 = outline - 4 = shadow startzeit der zeile ist wohl meist wtstart
Borderline
| lines BORDERLINE '(' expr ',' expr ')' '\n' { PrintBorderline( $4.value, $6.value ); }
kommt später, ist zu Komplex für mal eben
Killthisloop
| lines KILLTHISLOOP '\n' { KillThisLoop(); }
Beendet einen loopfile vorzeitigt. Dabei ist es egal wo der Text steht, der Loop wird trotzdem bis zum Ende durchlaufen und dann erst ausgesetzt. Die ist praktisch, wenn man beim generieren der Line z.B. nur ein Endwert bekannt ist, und man so oft loop, bis dieser überschritten ist und dann den Loop beendet und den Wert abspeichert etc.
Beispiel:
LOWKILL(meinloop,wtend) KILLTHISLOOP
Lowkill (if Ersatz)
| lines LOWKILL '(' expr ',' expr ')' '\n' { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value); return EXIT_SUCCESS;}else printf( "lowkill no %f>=%f\n",$4.value,$6.value); }
LOWKILL ist eine Art if-Abfrage, welche aber eine feste Bedingung stellt und zwar 1. Variable ist größergleich 2. Variable. Wenn dieser Fall eintrifft, ist der LOWKILL() True und greift ein. Es gilt das gleiche Prinzip wqie bei Textfind, wenn der LOWKILL Yes ist, wird der nachfolgende Code NICHT ausgeführt. Wenn die Bedingung nicht erfüllt ist, ist der LOWKILL NO und der nachfolgende Code wird ausgeführt. Der LOWKILL hat die Eigenschaft die gestellte Bedingung mit den aktuellen Werten und einem YES/NO im Comnsolemnfenster auszugeben. Kombiniert man dies mit PRINTS"" weiß man immer ungefähr, welcher Lowkill gerade ausgeführt wurde. Da LOWKILLS nicht übersprungen werden können, so wie if-Abfragen, kann man diese auch in extra TXT Dateien auslagern, um dort zu prüfen, ob die Bedingung erfüllt wurde oder nicht und diesen Wert dann zu speichern und später zu benutzen.
Beispiel:
meinloop=meinloop+1 LOWKILL(meinloop,wtend) KILLTHISLOOP
Fontmatch use
| lines FONTMATCHUSE STRING '\n' { fontmatchuse( $3.name ); }
Setzt die für die Position und Pixelberechnung von Calc die Font, welche verwendet werden soll. Normalerweise will man die Font des gelockten Styles verwenden, aber in Sonderfällen kann dies sehr sinnvoll sein. Muss in der pXh.txt benutzt werden, da dies für die weiteren Berechnungen benötigt wird.
Beispiel:
fontmatch use "auto"
fontmatch use "Arial"
Set flag
| lines SETFLAG STRING '\n' { set_flag( $3.name ); }
Die dritte wichtige Funktion für die pXh.txt Datei. Diese setzt die Art und Weise, wie ASSCalc die pX.txt loopen soll, bzw. wie es eine Line abarbeiten soll. Es gibt 5 Flags, welche gesetzt werden können:
* charwise
- Berechnet die Line pro Zeichen/Char/Buchstabe. Das heißt, die pX.txt Datei wird pro Zeichen (auch Leerzeichen) 1x ausgeführt. In dieser können dann wieder mit loopfiles undendlich viele weitere Dateien pro Zeichen aufgerufen werden.
* doublecharwise
- Für SHIFT-J Berechnung. Zwei Zeichen werden immer als eine Position behandelt, da SHIFT-J ein UTF8 Zeichen mit zwei Zeichen beschreiben muss. Durch die neue UTF8 unterstützung ist dieser FLAG eher nutzlos geworden.
* spacefix
- Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt. Ähnlich wie Skispace, aber keine genaueren Infos vorhanden. Bitte updaten.
* skipspace
- Berechnet die Line pro Silbe / {\k}. Die pX.txt wird pro Silbe 1x ausgeführt.
* no_k_ins
- keine Beschreibung vorhanden, bitte Updaten.
Wenn kein Flag angegeben ist, wird automatisch skipspace benutzt. Pro Effekt Layer kann nur 1 Flag benutzt werden. 2 Effekt Layer mit verschiedenen Flags sollten von der Position fast exakt übereinander liegen und können durch abspeichern der Posaition und des Textes auch in einem Layer benutzt werden.
Beispiel:
set flag "charwise"
time of
| lines TIMEOF expr '\n' { print_time_of( $3.value ); }
Gibt eine Zahl als ASS Timecode aus und schreibt ihn in die out.ass. Dies wird für die Zeiten der eigentlichen Line benötigt.
Beispiel:
time of 5
out.ass: 0:00:5.00
pos of
| lines POSOF expr '\n' { print_pos_of( $3.value ); }
Gibt eine Zahl genau so aus, wie sie im Script steht und schreibt sie in die out.ass. Wie oben schon erwähnt arbeitet Calc in Milisekunden. Somit wäre eine 1 im Script eine 1000 in der out.ass. Mit pos of 1 bleibt die Zahl auch in der out.ass 1. Dies ist bei Positionsangaben oder sonstigen Ganzzahlen sinnvoll, die man sonst durch /1000 teilen müsste.
POS OF rundet nach dem korrekten mathematischen Rundungssystem (fast ^^) d.h. es beachtet die 1. Kommastelle und rundet auf bei > 5 auf oder < 5 ab.
Für das Abschneiden der Kommastellen siehe auch TRUNC() unter Asscalc Expressions.
Beispiel:
pos of curx
out.ass: 351
pos of 5
out.ass: 5
pos of 5.4999
out.ass: 5
Hinweis: bei einer korrekten mathematischen Rundung, hätte 6 rauskommen müssen, da alle Kommastellen beachtet werden und nicht nur die erste!
pos of 5.5
out.ass: 6
hex of
| lines HEXOF expr '\n' { print_hex_of( $3.value ); }
Wandelt eine Ganzzahl in einen Hexwert um und schreibt diesen in die die out.ass. Dieser Vorgang kann nicht umgekehrt werden (Hex->Dezimal). Dabei sollte man beachten, dass ASS nur bis max. 255 -> FF Arbeitet, sprich schaut euch MIN() und MAX() an ;)
Beispiel:
hex of 255
out.ass: ff
char of
| lines CHAROF expr '\n' { print_char_of( $3.value ); }
Gibt das zur angegebenen Zahl zugehörige ANSI/UTF8 Zeichen (je nachdem ob ASSCalc V1 oder V2 benutzt wird) aus und schreibt es in die out.ass. Die einzigste Möglichkeit um dynamischen Text zu erzeugen, aber sehr aufwändig....
Beispiel:
char of 11 char of 22 char of 33 char of 44 char of 55 char of 66 char of 77 char of 88 char of 99 char of 25
out.ass: {charof ��!,7BMXc�}
color of
| lines COLOROF expr '\n' { print_color_of( $3.value ); }
Wandelt eine Ganzzahl in einen 6 stelligen Hexwert um und gibt diesen in der out.ass aus. Dies ist auch über hex of möglich, hat aber den Vorteil, das immer 6 Stellen ausgegeben werden. Wenn ihr schonmal eine Farbe mit 00FF00 hattet, wisst ihr was ich meine ;) (Es wird nur FF00 ausgegeben). Wenn ihr eine Farbe áus ASS Code in eine Dezimalzahl umrechnet wollt, benutzt ihr am besten den Windows Calc o.Ä. und gebt dort euren Hexwert ein, dann auf Dezimal drücken und man hat seinen Wert ;)
Beispiel:
color of 16593954
out.ass: fd3422
color of 5
out.ass: 000005
tval of
| lines TVALOF expr '\n' { print_tval_of( $3.value ); }
Gibt eine Zahl mit dem Faktor 1000 aus und schreibt sie in die out.ass. Dies entspricht der Standardausgabe von Calc und ist nur der Vollständigkeitshalber vorhanden. Es reicht auch nur die Variable ins Script zu schreiben.
TVAL OF rundet nach dem korrekten mathematischen Rundungssystem (fast ^^) d.h. es beachtet die 1. Zahl nach der definierten Ausgabenanzahl und rundet auf bei > 5 auf oder < 5 ab. Normalerweise werden durch die 1000er Faktorisierung immer die Ganzzahl und 3 Kommastellen beachtet. Daraus ergibt sich beim multiplizieren mit x1000 dann z.B. 1234 bei var = 1.234. Hat man nun eine weitere Zahl, tritt das rundungsystem automatisch in Kraft z.B. 1235 bei var = 1.2345. Erhöht sich die Zahl auf 10, ergänzt ASSCalc die vorherigen Stellen z.B. 1500 bei var = 1.4999.
Für das Abschneiden der Kommastellen siehe auch TRUNC() unter Asscalc Expressions.
Beispiel:
tval of 1
out.ass: 1000
tval of 0.1
out.ass: 100
tval of 0.01
out.ass: 10
tval of 0.001
out.ass: 1
tval of 1.499
out.ass: 1499
tval of 1.4999
out.ass: 1500
tval of 1.49949
out.ass: 1499
Hinweis: bei einer korrekten mathematischen Rundung, hätte 1500 rauskommen müssen, da alle Kommastellen beachtet werden und nicht nur die als nächstes folgende!
tval of 1.123
out.ass: 1123
tval of 1.1204
out.ass: 1120
tval of 1.2305
out.ass: 1231
tval of 1.23045
out.ass: 1230
Loopfile
| lines LOOPFILE STRING expr '\n' { loop_file( $3.name, $4.value, 1 ); }
Führt eine angegebene TXT Datei n mal aus. Die Datei wird dabei immer an die aktuelle angehängt. Das bedeutet es ist egal wo der loopfile steht, er wird erst ausgeführt, wenn die aktuelle Datei komplett durchlaufen wurde z.B. wenn ein Loopfile in der p1.txt steht weit oben steht, wird dieser erst nach der p1 ausgeführt und unten dran gehängt. Selbst wenn man noch in der p1 nach dem Loopfile Variablenanpassungen vornimmt, wird er diese auch schon benutzen. Ist etwas unlogisch, aber teilweise auch praktisch.
Beispiel:
loopfile "p1 in.txt" 1
loopfile "effekt.txt" variablenname
Loopfile2
| lines LOOPFILE2 STRING '(' expr ',' expr ')' '\n' { loop_file( $3.name, $5.value, $7.value ); }
Führt einen angegebene TXT Datei X*Y mal aus. Dieser Loopfile2 ist für Pixelberechnungen in verbindung mit pixbuf() gedacht. In den meißten Anwendungen wird hierbei die aktuelle Pixelbreite und Höhe der Silbe berechnet und als Raster abgearbeitet und zwar immer von oben nach unten / Zeile für Zeile. Wenn nun einmal die länge von Y erreicht wird, springt dieser Zähler wieder auf 0 und setzt den Spaltenzähler +1.
Es gibt 2 feste Variablen die in einem Loopfile2 mit generiert werden: loopvar und loopvar2.
- loopvar ist im ersten X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird
- loopvar2 ist im ersten Y Achsendurchlauf Yposloop 0 -> +nSilbenhöhe -> Ende Y => loopvar2 gibt den aktuellen Y Wert zurück, sprich zählt automatisch +1 pro Loopdurchlauf und wird bei erreichen der Silbenhöhe auf 0 zurück gesetzt.
Beispiel:
- loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy))
- entspricht loopfile2 "p1 in.txt" ((EndeX - AnfangX),(EndeY - AnfangY))
- entspricht Matrix aus (Silbenbreite,Silbenhöhe)
Exit
| lines EXIT '\n' { return EXIT_SUCCESS; }
Bitte Updaten. Warscheinlich ähnlich wie KILLTHISLOOP
Empty
| /* empty */
Kurz und knackig von Tentacle: "Das ist ne programmiertechnische Eigenart, die dem Kompiler sagt, dass leere zZeilen nicht zwangsweise ein fehler sind ..."
Error
| error '\n' { printf("\n error \n"); yyerrok; }
Bitte updaten.