├── .gitignore ├── example ├── run.bat ├── images │ ├── pixabaywitch and pixabayneue is from pixabay - public domain.txt │ ├── bg.png │ ├── tangoicons.txt │ ├── frame │ │ ├── eb_8.png │ │ ├── ff_8.png │ │ ├── m3_8.png │ │ ├── bk_24.png │ │ ├── blk_8.png │ │ ├── cart_8.png │ │ ├── utp_8.png │ │ ├── bubble_8.png │ │ └── default_8.png │ ├── tangoicons.png │ ├── pixabayneue.png │ └── pixabaywitch.png ├── audio │ ├── sfx │ │ ├── Sounds from Sonniss.com - GDC 2016;17;18;19;20- Game Audio Bundle.txt │ │ ├── Selection_Ukelele chord 04_mod.ogg │ │ └── voice_fun_man_character_deep_laugh_11.ogg │ └── text │ │ ├── neue.ogg │ │ ├── cackle.ogg │ │ ├── typing.ogg │ │ └── default.ogg ├── font │ ├── golden_apple.png │ ├── shinonome_12.ttf │ ├── shinonome_14.ttf │ ├── shinonome_16.ttf │ ├── comic_neue_13.ttf │ ├── earth_illusion.png │ ├── shinonome_LICENSE.txt │ ├── comic_neue_bold_19.ttf │ ├── monogram_extended_custom.ttf │ ├── monogram_extended_custom_credits.txt │ ├── Golden_Apple_LICENSE.txt │ ├── earth_illusion_LICENSE.txt │ ├── earth_illusion.fnt │ └── golden_apple.fnt ├── longtext.lua ├── conf.lua ├── library │ ├── slog-icon.lua │ ├── slog-frame.lua │ └── slog-pixel.lua └── main.lua ├── .vscode └── settings.json ├── .gitattributes ├── screenshots ├── 3.png ├── 4.png ├── 5.gif ├── 6.gif ├── 7.gif ├── 8.gif ├── 01.gif ├── 02.gif ├── ex.gif ├── bius.png ├── mirror.png ├── rotate.png ├── effects.gif └── dropshadow.png ├── LICENSE └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | example/.vscode/settings.json 3 | -------------------------------------------------------------------------------- /example/run.bat: -------------------------------------------------------------------------------- 1 | "c:\Program Files (x86)\LOVE\love.exe" . -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Lua.workspace.checkThirdParty": false 3 | } -------------------------------------------------------------------------------- /example/images/pixabaywitch and pixabayneue is from pixabay - public domain.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /example/audio/sfx/Sounds from Sonniss.com - GDC 2016;17;18;19;20- Game Audio Bundle.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/3.png -------------------------------------------------------------------------------- /screenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/4.png -------------------------------------------------------------------------------- /screenshots/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/5.gif -------------------------------------------------------------------------------- /screenshots/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/6.gif -------------------------------------------------------------------------------- /screenshots/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/7.gif -------------------------------------------------------------------------------- /screenshots/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/8.gif -------------------------------------------------------------------------------- /screenshots/01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/01.gif -------------------------------------------------------------------------------- /screenshots/02.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/02.gif -------------------------------------------------------------------------------- /screenshots/ex.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/ex.gif -------------------------------------------------------------------------------- /example/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/bg.png -------------------------------------------------------------------------------- /example/images/tangoicons.txt: -------------------------------------------------------------------------------- 1 | https://commons.wikimedia.org/wiki/Tango_icons 2 | Public Domain 3 | -------------------------------------------------------------------------------- /screenshots/bius.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/bius.png -------------------------------------------------------------------------------- /screenshots/mirror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/mirror.png -------------------------------------------------------------------------------- /screenshots/rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/rotate.png -------------------------------------------------------------------------------- /screenshots/effects.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/effects.gif -------------------------------------------------------------------------------- /example/audio/text/neue.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/text/neue.ogg -------------------------------------------------------------------------------- /screenshots/dropshadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/screenshots/dropshadow.png -------------------------------------------------------------------------------- /example/audio/text/cackle.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/text/cackle.ogg -------------------------------------------------------------------------------- /example/audio/text/typing.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/text/typing.ogg -------------------------------------------------------------------------------- /example/font/golden_apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/golden_apple.png -------------------------------------------------------------------------------- /example/font/shinonome_12.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/shinonome_12.ttf -------------------------------------------------------------------------------- /example/font/shinonome_14.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/shinonome_14.ttf -------------------------------------------------------------------------------- /example/font/shinonome_16.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/shinonome_16.ttf -------------------------------------------------------------------------------- /example/images/frame/eb_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/eb_8.png -------------------------------------------------------------------------------- /example/images/frame/ff_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/ff_8.png -------------------------------------------------------------------------------- /example/images/frame/m3_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/m3_8.png -------------------------------------------------------------------------------- /example/images/tangoicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/tangoicons.png -------------------------------------------------------------------------------- /example/audio/text/default.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/text/default.ogg -------------------------------------------------------------------------------- /example/font/comic_neue_13.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/comic_neue_13.ttf -------------------------------------------------------------------------------- /example/font/earth_illusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/earth_illusion.png -------------------------------------------------------------------------------- /example/images/frame/bk_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/bk_24.png -------------------------------------------------------------------------------- /example/images/frame/blk_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/blk_8.png -------------------------------------------------------------------------------- /example/images/frame/cart_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/cart_8.png -------------------------------------------------------------------------------- /example/images/frame/utp_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/utp_8.png -------------------------------------------------------------------------------- /example/images/pixabayneue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/pixabayneue.png -------------------------------------------------------------------------------- /example/images/pixabaywitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/pixabaywitch.png -------------------------------------------------------------------------------- /example/font/shinonome_LICENSE.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/shinonome_LICENSE.txt -------------------------------------------------------------------------------- /example/images/frame/bubble_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/bubble_8.png -------------------------------------------------------------------------------- /example/images/frame/default_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/images/frame/default_8.png -------------------------------------------------------------------------------- /example/font/comic_neue_bold_19.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/comic_neue_bold_19.ttf -------------------------------------------------------------------------------- /example/font/monogram_extended_custom.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/font/monogram_extended_custom.ttf -------------------------------------------------------------------------------- /example/audio/sfx/Selection_Ukelele chord 04_mod.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/sfx/Selection_Ukelele chord 04_mod.ogg -------------------------------------------------------------------------------- /example/audio/sfx/voice_fun_man_character_deep_laugh_11.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysl-dev/SYSL-Text/HEAD/example/audio/sfx/voice_fun_man_character_deep_laugh_11.ogg -------------------------------------------------------------------------------- /example/font/monogram_extended_custom_credits.txt: -------------------------------------------------------------------------------- 1 | # CREDITS 2 | 3 | Monogram is a free and Creative Commons Zero pixel font, 4 | made by Vinícius Menézio (@vmenezio). 5 | 6 | https://datagoblin.itch.io/monogram 7 | 8 | 9 | # SPECIAL THANKS 10 | 11 | thanks to Ateş Göral (@atesgoral) for creating the bitmap font converter: 12 | https://codepen.io/atesgoral/details/RwGOvPZ 13 | 14 | thanks to Éric Araujo (@merwok_) for the inital port of monogram to PICO-8: 15 | https://itch.io/post/2625522 16 | 17 | Modified by Sheepolution. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 C.Hall for text.lua "Slog-text" 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /example/longtext.lua: -------------------------------------------------------------------------------- 1 | return [[ 2 | [swing=30]H[swing=20]e[swing=10]l[swing=5]l[swing=1]o[/swing] [shake=30]t[shake=20]h[shake=10]e[shake=00]r[shake=-30]e[/shake], [spin=10]w[spin=9]e[spin=8]l[spin=7]c[spin=5]o[spin=3]m[spin=0]e[/spin] [blink=1]t[blink=2]o[blink=2.5] t[blink=-3]h[blink=4]e[/blink] [raindrop=3]l[raindrop=2]i[raindrop=1]b[raindrop=0]r[raindrop=-1]a[raindrop=-2]r[raindrop=-3]y[raindrop=999]![/raindrop] 3 | [font=earth_illusion][bounce=0][rainbow=3=100]Hello! Welcome [rainbow=10=-30]to [rainbow=20]the [rainbow=1]library![/rainbow][/bounce][/font] 4 | 5 | This library will work with any font object that love can produce, and at any scale. So even if you don't use pixel art, this library will work for you! 6 | 7 | Note, in order to apply all the effects and animate everything each character is a draw call. So if you have a lot of text, like a visual novel, it might be overkill. 8 | 9 | [b]b[/b] - [b]Fake Bold[/b] [b]u[/b] - [u]Underline[/u] [shadowcolor=#FF0000] [b]dropshadow=[/b]# - Style[font=earth_illusion] [dropshadow=0]00 [dropshadow=1]01 [dropshadow=2]02 [dropshadow=3]03 [dropshadow=4]04 [dropshadow=5]05 [shadowcolor=#00FFAA][dropshadow=6]06 [dropshadow=7]07 [dropshadow=8]08 [dropshadow=9]09 [dropshadow=10]10[/dropshadow][/font] 10 | [b]i[/b] - [i]Fake Italics[/i] [b]s[/b] - [s]Strikethrough[/s] [b]mirror[/b] - [mirror]Print text backwards[/mirror] (Print Text Backwards) [b]rotate[/b]=# - [rotate=180]Rotate Text[/rotate] (Rotate Text) 11 | [b]color[/b]=# - [color=20]Sets color, based on a palette table.[/color] [color=#AA2032]Or Hex #AA2032[/color] [b]font=font_name[/b] - [font=comic_neue]Change font ([b]B[/b] [i]I[/i] [u=-3]U[/u] [s=1]S[/s]) 12 | 13 | [/font][b]scale[/b]=# - [scale=2]Scale the text[/scale] 14 | 15 | [b=30]shake[/b] - [shake]Shake Text[/shake] [b]bounce[/b] - [bounce]Bounce Text[/bounce] 16 | [b]spin[/b] - [spin]Spin Text[/spin] [b]blink[/b] - [blink]Blink Text[/blink] 17 | [b]swing[/b] - [swing]Swing Text[/swing] [b]rainbow[/b] - [rainbow]Raibow Text[/rainbow] 18 | [b]raindrop[/b] - [raindrop]Rain Fall Text[/raindrop] [b]shader[/b] - [shader=x_gradient]Apply a shader for advanced text control - have fun![/shader] 19 | [rainbow=4=100][bounce][shake]Combine them for more effects![/shake][/bounce][/rainbow] - (rainbow bounce shake) 20 | 21 | A note on Unicode characters: 22 | You can just use them! 23 | Thèn you can print it to your hèarts dèsirè. 24 | You can even wrap more than one character this way. 25 | ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçö 26 | [rainbow][swing]Tèxt èffects[/swing] [shake]work too! Cool èh? [/shake][/rainbow] 27 | This will even work for other languages! 28 | [font=shinonome_12]こんにちは![/font][font=shinonome_14]こんにちは![/font][font=shinonome_16]こんにちは![/font] 29 | 30 | You can even draw an image directly in the text! 31 | [image=frame=default_8][image=frame=eb_8][image=frame=m3_8] ]] -------------------------------------------------------------------------------- /example/conf.lua: -------------------------------------------------------------------------------- 1 | function love.conf(t) 2 | t.identity = "Love2D - SYSL-Text - Example" -- The name of the save directory (string) 3 | t.version = "11.3" -- The LÖVE version this game was made for (string) 4 | t.console = true -- Attach a console (boolean, Windows only) 5 | t.accelerometerjoystick = false -- Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) 6 | t.externalstorage = false -- True to save files (and read from the save directory) in external storage on Android (boolean) 7 | t.gammacorrect = false -- Enable gamma-correct rendering, when supported by the system (boolean) 8 | 9 | t.window.title = "Love2D - SYSL-Text - Example" -- The window title (string) 10 | t.window.icon = nil -- Filepath to an image to use as the window's icon (string) 11 | t.window.width = 320 -- The window width (number) 12 | t.window.height = 180 -- The window height (number) 13 | t.window.borderless = false -- Remove all border visuals from the window (boolean) 14 | t.window.resizable = false -- Let the window be user-resizable (boolean) 15 | t.window.minwidth = 320 -- Minimum window width if the window is resizable (number) 16 | t.window.minheight = 180 -- Minimum window height if the window is resizable (number) 17 | t.window.fullscreen = false -- Enable fullscreen (boolean) 18 | t.window.fullscreentype = "desktop" -- Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) 19 | t.window.vsync = 1 -- Enable vertical sync (boolean) 20 | t.window.msaa = 0 -- The number of samples to use with multi-sampled antialiasing (number) 21 | t.window.display = 1 -- Index of the monitor to show the window in (number) 22 | t.window.highdpi = false -- Enable high-dpi mode for the window on a Retina display (boolean) 23 | t.window.x = nil -- The x-coordinate of the window's position in the specified display (number) 24 | t.window.y = nil -- The y-coordinate of the window's position in the specified display (number) 25 | 26 | t.modules.audio = true -- Enable the audio module (boolean) 27 | t.modules.event = true -- Enable the event module (boolean) 28 | t.modules.graphics = true -- Enable the graphics module (boolean) 29 | t.modules.image = true -- Enable the image module (boolean) 30 | t.modules.joystick = true -- Enable the joystick module (boolean) 31 | t.modules.keyboard = true -- Enable the keyboard module (boolean) 32 | t.modules.math = true -- Enable the math module (boolean) 33 | t.modules.mouse = true -- Enable the mouse module (boolean) 34 | t.modules.physics = true -- Enable the physics module (boolean) 35 | t.modules.sound = true -- Enable the sound module (boolean) 36 | t.modules.system = true -- Enable the system module (boolean) 37 | t.modules.timer = true -- Enable the timer module (boolean), Disabling it will result 0 delta time in love.update 38 | t.modules.touch = true -- Enable the touch module (boolean) 39 | t.modules.video = true -- Enable the video module (boolean) 40 | t.modules.window = true -- Enable the window module (boolean) 41 | t.modules.thread = true -- Enable the thread module (boolean) 42 | end 43 | -------------------------------------------------------------------------------- /example/font/Golden_Apple_LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, “systeml” 2 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 3 | This license is copied below, and is also available with a FAQ at: 4 | http://scripts.sil.org/OFL 5 | ----------------------------------------------------------- 6 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 7 | ----------------------------------------------------------- 8 | PREAMBLE 9 | The goals of the Open Font License (OFL) are to stimulate worldwide 10 | development of collaborative font projects, to support the font creation 11 | efforts of academic and linguistic communities, and to provide a free and 12 | open framework in which fonts may be shared and improved in partnership 13 | with others. 14 | The OFL allows the licensed fonts to be used, studied, modified and 15 | redistributed freely as long as they are not sold by themselves. The 16 | fonts, including any derivative works, can be bundled, embedded, 17 | redistributed and/or sold with any software provided that any reserved 18 | names are not used by derivative works. The fonts and derivatives, 19 | however, cannot be released under any other type of license. The 20 | requirement for fonts to remain under this license does not apply 21 | to any document created using the fonts or their derivatives. 22 | DEFINITIONS 23 | "Font Software" refers to the set of files released by the Copyright 24 | Holder(s) under this license and clearly marked as such. This may 25 | include source files, build scripts and documentation. 26 | "Reserved Font Name" refers to any names specified as such after the 27 | copyright statement(s). 28 | "Original Version" refers to the collection of Font Software components as 29 | distributed by the Copyright Holder(s). 30 | "Modified Version" refers to any derivative made by adding to, deleting, 31 | or substituting -- in part or in whole -- any of the components of the 32 | Original Version, by changing formats or by porting the Font Software to a 33 | new environment. 34 | "Author" refers to any designer, engineer, programmer, technical 35 | writer or other person who contributed to the Font Software. 36 | PERMISSION & CONDITIONS 37 | Permission is hereby granted, free of charge, to any person obtaining 38 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 39 | redistribute, and sell modified and unmodified copies of the Font 40 | Software, subject to the following conditions: 41 | 1) Neither the Font Software nor any of its individual components, 42 | in Original or Modified Versions, may be sold by itself. 43 | 2) Original or Modified Versions of the Font Software may be bundled, 44 | redistributed and/or sold with any software, provided that each copy 45 | contains the above copyright notice and this license. These can be 46 | included either as stand-alone text files, human-readable headers or 47 | in the appropriate machine-readable metadata fields within text or 48 | binary files as long as those fields can be easily viewed by the user. 49 | 3) No Modified Version of the Font Software may use the Reserved Font 50 | Name(s) unless explicit written permission is granted by the corresponding 51 | Copyright Holder. This restriction only applies to the primary font name as 52 | presented to the users. 53 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 54 | Software shall not be used to promote, endorse or advertise any 55 | Modified Version, except to acknowledge the contribution(s) of the 56 | Copyright Holder(s) and the Author(s) or with their explicit written 57 | permission. 58 | 5) The Font Software, modified or unmodified, in part or in whole, 59 | must be distributed entirely under this license, and must not be 60 | distributed under any other license. The requirement for fonts to 61 | remain under this license does not apply to any document created 62 | using the Font Software. 63 | TERMINATION 64 | This license becomes null and void if any of the above conditions are 65 | not met. 66 | DISCLAIMER 67 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 68 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 69 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 70 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 71 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 72 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 73 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 74 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 75 | OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /example/font/earth_illusion_LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, “systeml” 2 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 3 | This license is copied below, and is also available with a FAQ at: 4 | http://scripts.sil.org/OFL 5 | ----------------------------------------------------------- 6 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 7 | ----------------------------------------------------------- 8 | PREAMBLE 9 | The goals of the Open Font License (OFL) are to stimulate worldwide 10 | development of collaborative font projects, to support the font creation 11 | efforts of academic and linguistic communities, and to provide a free and 12 | open framework in which fonts may be shared and improved in partnership 13 | with others. 14 | The OFL allows the licensed fonts to be used, studied, modified and 15 | redistributed freely as long as they are not sold by themselves. The 16 | fonts, including any derivative works, can be bundled, embedded, 17 | redistributed and/or sold with any software provided that any reserved 18 | names are not used by derivative works. The fonts and derivatives, 19 | however, cannot be released under any other type of license. The 20 | requirement for fonts to remain under this license does not apply 21 | to any document created using the fonts or their derivatives. 22 | DEFINITIONS 23 | "Font Software" refers to the set of files released by the Copyright 24 | Holder(s) under this license and clearly marked as such. This may 25 | include source files, build scripts and documentation. 26 | "Reserved Font Name" refers to any names specified as such after the 27 | copyright statement(s). 28 | "Original Version" refers to the collection of Font Software components as 29 | distributed by the Copyright Holder(s). 30 | "Modified Version" refers to any derivative made by adding to, deleting, 31 | or substituting -- in part or in whole -- any of the components of the 32 | Original Version, by changing formats or by porting the Font Software to a 33 | new environment. 34 | "Author" refers to any designer, engineer, programmer, technical 35 | writer or other person who contributed to the Font Software. 36 | PERMISSION & CONDITIONS 37 | Permission is hereby granted, free of charge, to any person obtaining 38 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 39 | redistribute, and sell modified and unmodified copies of the Font 40 | Software, subject to the following conditions: 41 | 1) Neither the Font Software nor any of its individual components, 42 | in Original or Modified Versions, may be sold by itself. 43 | 2) Original or Modified Versions of the Font Software may be bundled, 44 | redistributed and/or sold with any software, provided that each copy 45 | contains the above copyright notice and this license. These can be 46 | included either as stand-alone text files, human-readable headers or 47 | in the appropriate machine-readable metadata fields within text or 48 | binary files as long as those fields can be easily viewed by the user. 49 | 3) No Modified Version of the Font Software may use the Reserved Font 50 | Name(s) unless explicit written permission is granted by the corresponding 51 | Copyright Holder. This restriction only applies to the primary font name as 52 | presented to the users. 53 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 54 | Software shall not be used to promote, endorse or advertise any 55 | Modified Version, except to acknowledge the contribution(s) of the 56 | Copyright Holder(s) and the Author(s) or with their explicit written 57 | permission. 58 | 5) The Font Software, modified or unmodified, in part or in whole, 59 | must be distributed entirely under this license, and must not be 60 | distributed under any other license. The requirement for fonts to 61 | remain under this license does not apply to any document created 62 | using the Font Software. 63 | TERMINATION 64 | This license becomes null and void if any of the above conditions are 65 | not met. 66 | DISCLAIMER 67 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 68 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 69 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 70 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 71 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 72 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 73 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 74 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 75 | OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /example/library/slog-icon.lua: -------------------------------------------------------------------------------- 1 | local m = { 2 | debug = false, 3 | _NAME = 'GUI Icon', 4 | _VERSION = '1.0', 5 | _DESCRIPTION = [[ 6 | Icon Loader 7 | Loads a texture containing a series of icons, splits and displays them. 8 | ]], 9 | _URL = 'https://github.com/SystemLogoff', 10 | _LICENSE = [[ 11 | MIT LICENSE 12 | 13 | Copyright (c) 2020 Chris / Systemlogoff 14 | 15 | Permission is hereby granted, free of charge, to any person obtaining a 16 | copy of this software and associated documentation files (the 17 | "Software"), to deal in the Software without restriction, including 18 | without limitation the rights to use, copy, modify, merge, publish, 19 | distribute, sublicense, and/or sell copies of the Software, and to 20 | permit persons to whom the Software is furnished to do so, subject to 21 | the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included 24 | in all copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 27 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 29 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 30 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 31 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 32 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 33 | ]] 34 | } 35 | -- TODO: Make like frame and scan a folder for a list of icons and create icon sets to use. 36 | -- * Local Functions and Variables * -- 37 | -- * Moving Global to Local for often used variables. 38 | -- Read more: http://lua-users.org/wiki/OptimisingUsingLocalVariables 39 | local print = print 40 | local love = love 41 | local unpack = unpack 42 | 43 | -- * Improved Debug Message Function 44 | local function dprint(...) 45 | if m.debug then 46 | print(m._NAME .. ": ", unpack({...})) 47 | end 48 | end 49 | 50 | dprint("Loaded") 51 | 52 | -- * Take an image, chop it into tiles, return a table of those tiles. 53 | local function quadMaker(image, tilesizex, tilesizey) -- Only supports square tiles. 54 | local tileset_table = {} 55 | local counter = 1 56 | tilesizex = tilesizex or 16 57 | tilesizey = tilesizey or tilesizex 58 | for y = 0, image:getHeight()-1, tilesizey do 59 | for x = 0, image:getWidth()-1, tilesizex do 60 | tileset_table[counter] = love.graphics.newQuad( x, y, tilesizex, tilesizey, image:getWidth(), image:getHeight()) 61 | counter = counter + 1 62 | end 63 | end 64 | return tileset_table 65 | end 66 | 67 | --[[ Configuration ]]----------------------------------------------------------- 68 | -- Texture Image 69 | local game_icon_image = nil 70 | 71 | local icon_size = nil 72 | 73 | -- Icon Quad Table 74 | 75 | 76 | --[[ End Configuration ]]------------------------------------------------------- 77 | 78 | -- Return number of icons. 79 | 80 | function m.configure(setup_icon_size, setup_icon_set) 81 | game_icon_image = setup_icon_set 82 | icon_size = setup_icon_size 83 | m.number = quadMaker(game_icon_image, icon_size, icon_size); dprint("Total Icons:", #m.number) 84 | end 85 | 86 | function m.count() 87 | return #m.number 88 | end 89 | 90 | function m.tilesize() 91 | return icon_size 92 | end 93 | 94 | -- Draw icon with the standard love.graphics.draw format 95 | function m.draw_standard(num, ...) 96 | love.graphics.draw(game_icon_image, m.number[num], unpack({...})) 97 | end 98 | 99 | -- Draw icon centered for easy centered rotation 100 | function m.draw(num, ...) 101 | -- Modify values to deal with weird inputs for x,y,r,sx,sy,ox,oy 102 | local _modify = {unpack({...})} 103 | _modify[1] = _modify[1] or 0 104 | _modify[1] = _modify[1] + icon_size/2 105 | _modify[2] = _modify[2] or 0 106 | _modify[2] = _modify[2] + icon_size/2 107 | _modify[3] = _modify[3] or 0 108 | _modify[4] = _modify[4] or 1 109 | _modify[5] = _modify[5] or 1 110 | _modify[6] = icon_size/2 111 | _modify[7] = icon_size/2 112 | love.graphics.draw(game_icon_image, m.number[num], unpack(_modify)) 113 | end 114 | 115 | -- Draw colored centered icon 116 | function m.draw_tint(num, tone, ...) 117 | -- Modify values to deal with weird inputs for x,y,r,sx,sy,ox,oy 118 | local _modify = {unpack({...})} 119 | _modify[1] = _modify[1] or 0 120 | _modify[1] = _modify[1] + icon_size/2 121 | _modify[2] = _modify[2] or 0 122 | _modify[2] = _modify[2] + icon_size/2 123 | _modify[3] = _modify[3] or 0 124 | _modify[4] = _modify[4] or 1 125 | _modify[5] = _modify[5] or 1 126 | _modify[6] = icon_size/2 127 | _modify[7] = icon_size/2 128 | tone = tone or {1,1,1,1} 129 | love.graphics.setColor(tone) 130 | love.graphics.draw(game_icon_image, m.number[num], unpack(_modify)) 131 | love.graphics.setColor({1,1,1,1}) 132 | end 133 | 134 | -- Draw icon that's long, rotation point based on first icon. 135 | function m.draw_long(num, count, ...) 136 | -- Modify values to deal with weird inputs for x,y,r,sx,sy,ox,oy 137 | for i = 1, count do 138 | local _modify = {unpack({...})} 139 | _modify[1] = _modify[1] or 0 140 | _modify[1] = _modify[1] + icon_size/2 141 | _modify[1] = _modify[1] 142 | _modify[2] = _modify[2] or 0 143 | _modify[2] = _modify[2] + icon_size/2 144 | _modify[3] = _modify[3] or 0 145 | _modify[4] = _modify[4] or 1 146 | _modify[5] = _modify[5] or 1 147 | _modify[6] = icon_size/2 - icon_size * (i-1) 148 | _modify[7] = icon_size/2 149 | love.graphics.draw(game_icon_image, m.number[num + (i-1)], unpack(_modify)) 150 | end 151 | end 152 | --[[ End of library ]]---------------------------------------------------------- 153 | return m 154 | -------------------------------------------------------------------------------- /example/library/slog-frame.lua: -------------------------------------------------------------------------------- 1 | local m = { 2 | debug = true, 3 | _NAME = 'GUI Frame', 4 | _VERSION = '0.2', 5 | _DESCRIPTION = 'A frame slicer and drawer, works well with slog.gui. Very beta, please clean up if you use it.', 6 | _URL = 'https://github.com/SystemLogoff/SLog-Library', 7 | _LICENSE = [[ 8 | MIT LICENSE 9 | 10 | Copyright (c) 2019 Chris / Systemlogoff 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a 13 | copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included 21 | in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 24 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 26 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 27 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 28 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 29 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | ]] 31 | } 32 | 33 | --[[ Make Global Functions Local ]]--------------------------------------------- 34 | -- Read more: http://lua-users.org/wiki/OptimisingUsingLocalVariables 35 | local print = print 36 | local love = love 37 | local math = math 38 | 39 | --[[ Useful Local Functions ]]-------------------------------------------------- 40 | local function dprint(...) 41 | if m.debug then 42 | print(m._NAME .. ": ", unpack({...})) 43 | end 44 | end 45 | 46 | dprint("Loaded") 47 | 48 | --[[ Notes ]]------------------------------------------------------------------- 49 | -- Splits a string into parts by a single character. 50 | -- Inputs, String , Single Character to split 51 | local function stringSplitSingle(str,sep) 52 | local return_string={} 53 | local n=1 54 | for w in str:gmatch("([^"..sep.."]*)") do 55 | return_string[n] = return_string[n] or w -- only set once (so the blank after a string is ignored) 56 | if w=="" then 57 | n = n + 1 58 | end -- step forwards on a blank but not a string 59 | end 60 | return return_string 61 | end 62 | 63 | 64 | --[[ Configuration ]]----------------------------------------------------------- 65 | --[[ Notes ]]------------------------------------------------------------------- 66 | -- What table holds the image frames? _G[texture_container][folder_frames] 67 | local texture_container = "images" 68 | local folder_frames = "frame" 69 | 70 | -- What frame to default to if the wrong one is loaded. 71 | local default_frame = "default" 72 | 73 | -- Table that holds the generated frames. 74 | m.select = {} 75 | 76 | --[[ Frames ]]------------------------------------------------------------------ 77 | 78 | --[[ Notes ]]------------------------------------------------------------------- 79 | -- Import all frames from _G[texture_container][folder_frames] 80 | function m.load() 81 | for i,v in pairs(_G[texture_container][folder_frames]) do 82 | local temptable = {} 83 | temptable = stringSplitSingle(i,"_") 84 | if #temptable == 2 then 85 | m.create(temptable[1], i ,tonumber(temptable[2]),tonumber(temptable[2]),tonumber(temptable[2]),tonumber(temptable[2]),tonumber(temptable[2]),tonumber(temptable[2])) 86 | elseif #temptable == 7 then 87 | m.create(temptable[1], i, tonumber(temptable[2]),tonumber(temptable[3]),tonumber(temptable[4]),tonumber(temptable[5]),tonumber(temptable[6]),tonumber(temptable[7])) 88 | else 89 | print("Error: Frame name does not match format. Name_Size, or Name_Size1_Size2_...Size_6") 90 | end 91 | end 92 | end 93 | 94 | --[[ Notes ]]------------------------------------------------------------------- 95 | -- Slice a frame 96 | function m.create(name, imagename, size, size2, size3, size4, size5, size6) 97 | local image_width = size + size2 + size3 98 | local image_height = size4 + size5 + size6 99 | m.select[name] = { 100 | ["image"] = imagename, 101 | ["sizes"] = {size,size2,size3,size4,size5,size6}, -- X Width 1, 2, 3 Row, Y same Col 102 | ["TL"] = love.graphics.newQuad(0, 0, size, size4, image_width, image_height), 103 | ["TM"] = love.graphics.newQuad(0 + size, 0, size2, size4, image_width, image_height), 104 | ["TR"] = love.graphics.newQuad(0 + size + size2, 0, size3, size4, image_width, image_height), 105 | ["ML"] = love.graphics.newQuad(0, 0 + size4, size, size5, image_width, image_height), 106 | ["MM"] = love.graphics.newQuad(0 + size, 0 + size4, size2, size5, image_width, image_height), 107 | ["MR"] = love.graphics.newQuad(0 + size + size2, 0 + size4, size3, size5, image_width, image_height), 108 | ["BL"] = love.graphics.newQuad(0, 0 + size4 + size5, size, size6, image_width, image_height), 109 | ["BM"] = love.graphics.newQuad(0 + size, 0 + size4 + size5, size2, size6, image_width, image_height), 110 | ["BR"] = love.graphics.newQuad(0 + size + size2, 0 + size4 + size5, size3, size6, image_width, image_height), 111 | } 112 | end 113 | 114 | --[[ Notes ]]------------------------------------------------------------------- 115 | -- Draw a frame with the parts stretched out. 116 | function m.draw(name,x,y,w,h) 117 | local frame_image = _G[texture_container][folder_frames] 118 | local cur_frame = m.select[name] 119 | if cur_frame == nil then 120 | cur_frame = m.select[default_frame] 121 | name = default_frame 122 | end 123 | frame_image = frame_image[m.select[name].image] 124 | local width_center = (w - cur_frame.sizes[1] - cur_frame.sizes[3]) / cur_frame.sizes[2] 125 | local height_center = (h - cur_frame.sizes[4] - cur_frame.sizes[6]) / cur_frame.sizes[5] 126 | local padding = {top = cur_frame.sizes[4], right = cur_frame.sizes[3], bottom = cur_frame.sizes[6], left = cur_frame.sizes[1]} 127 | 128 | -- Center 129 | love.graphics.draw(frame_image, cur_frame["MM"], x + padding.left, y + padding.top, 0, width_center, height_center) 130 | -- Sides 131 | -- Top 132 | love.graphics.draw(frame_image, cur_frame["TM"], x + padding.left, y, 0, width_center, 1) 133 | -- Right 134 | love.graphics.draw(frame_image, cur_frame["MR"], x + w - padding.right, y + padding.top, 0, 1, height_center) 135 | -- Bottom 136 | love.graphics.draw(frame_image, cur_frame["BM"], x + padding.left, y + h - padding.bottom, 0, width_center, 1) 137 | -- Left 138 | love.graphics.draw(frame_image, cur_frame["ML"], x, y + padding.top, 0, 1, height_center) 139 | -- Corners 140 | love.graphics.draw(frame_image, cur_frame["TL"], x, y) 141 | love.graphics.draw(frame_image, cur_frame["TR"], x + w - padding.right, y) 142 | love.graphics.draw(frame_image, cur_frame["BL"], x, y + h - cur_frame.sizes[6]) 143 | love.graphics.draw(frame_image, cur_frame["BR"], x + w - padding.right, y + h - padding.bottom) 144 | end 145 | 146 | --[[ Notes ]]------------------------------------------------------------------- 147 | -- Draw a frame with the parts tiled. 148 | function m.draw_tiled(name,x,y,w,h,not_perfect) 149 | local trycount = 0 150 | local adjust_tiles = 0 151 | not_perfect = not_perfect or false 152 | local frame_image = _G[texture_container][folder_frames] 153 | local cur_frame = m.select[name] 154 | if cur_frame == nil then 155 | cur_frame = m.select[default_frame] 156 | name = default_frame 157 | end 158 | frame_image = frame_image[m.select[name].image] 159 | 160 | if not not_perfect then 161 | trycount = 0 162 | while w % cur_frame.sizes[2] ~= 0 do 163 | w = w + 1 164 | w = math.floor(w) 165 | trycount = trycount + 1 166 | if trycount > 100 then break end 167 | end 168 | trycount = 0 169 | while h % cur_frame.sizes[5] ~= 0 do 170 | h = h + 1 171 | h = math.floor(h) 172 | trycount = trycount + 1 173 | if trycount > 100 then break end 174 | end 175 | else 176 | adjust_tiles = 1 177 | end 178 | 179 | local width_center = (w - cur_frame.sizes[1] - cur_frame.sizes[3]) / cur_frame.sizes[2] 180 | local height_center = (h - cur_frame.sizes[4] - cur_frame.sizes[6]) / cur_frame.sizes[5] 181 | local padding = {top = cur_frame.sizes[4], right = cur_frame.sizes[3], bottom = cur_frame.sizes[6], left = cur_frame.sizes[1]} 182 | 183 | -- Center 184 | for tx=0, width_center - 1 + adjust_tiles do 185 | for ty=0, height_center - 1 + adjust_tiles do 186 | love.graphics.draw(frame_image, cur_frame["MM"], x + padding.left + (tx * cur_frame.sizes[2]) , y + padding.top + (ty * cur_frame.sizes[5])) 187 | end 188 | end 189 | -- Sides 190 | -- Top 191 | for i=0, width_center - 1 + adjust_tiles do 192 | love.graphics.draw(frame_image, cur_frame["TM"], x + padding.left + (i * cur_frame.sizes[2]), y) 193 | end 194 | -- Right 195 | for i=0, height_center - 1 + adjust_tiles do 196 | love.graphics.draw(frame_image, cur_frame["MR"], x + w - padding.right, y + padding.top + (i * cur_frame.sizes[5])) 197 | end 198 | -- Bottom 199 | for i=0, width_center - 1 + adjust_tiles do 200 | love.graphics.draw(frame_image, cur_frame["BM"], x + padding.left + (i * cur_frame.sizes[2]), y + h - padding.bottom) 201 | end 202 | -- Left 203 | for i=0, height_center - 1 + adjust_tiles do 204 | love.graphics.draw(frame_image, cur_frame["ML"], x, y + padding.top + (i * cur_frame.sizes[5])) 205 | end 206 | -- Corner 207 | love.graphics.draw(frame_image, cur_frame["TL"], x, y) 208 | love.graphics.draw(frame_image, cur_frame["TR"], x + w - padding.right, y) 209 | love.graphics.draw(frame_image, cur_frame["BL"], x, y + h - cur_frame.sizes[6]) 210 | love.graphics.draw(frame_image, cur_frame["BR"], x + w - padding.right, y + h - padding.bottom) 211 | end 212 | --[[ End Frames ]]-------------------------------------------------------------- 213 | 214 | return m 215 | -------------------------------------------------------------------------------- /example/library/slog-pixel.lua: -------------------------------------------------------------------------------- 1 | local m = { 2 | debug = false, 3 | _NAME = 'SYSL-Pixel-Modified-for-Text-Example', 4 | _VERSION = '3.0', 5 | _DESCRIPTION = 'A Pixel Perfect Screen Scaling Library for Love2D', 6 | _URL = 'https://github.com/SystemLogoff', 7 | _LICENSE = [[ 8 | MIT LICENSE 9 | 10 | Copyright (c) 2020 Chris / Systemlogoff 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a 13 | copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included 21 | in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 24 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 26 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 27 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 28 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 29 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | ]] 31 | } 32 | -- TODO: Expose Canvas Controls 33 | 34 | 35 | -- * Local Functions and Variables * -- 36 | -- * Moving Global to Local for often used variables. 37 | -- Read more: http://lua-users.org/wiki/OptimisingUsingLocalVariables 38 | local print = print 39 | local love = love 40 | 41 | 42 | -- * Improved Debug Message Function 43 | local function dprint(...) 44 | if m.debug then 45 | print(m._NAME .. ": ", unpack({...})) 46 | end 47 | end 48 | 49 | dprint("Loaded") 50 | 51 | -- * Capture the conf.lua settings for Window Size 52 | local base = { 53 | width = love.graphics.getWidth(), 54 | height = love.graphics.getHeight() 55 | } 56 | 57 | -- * A table to hold a series of shaders to apply to the canvas 58 | local shader_pool = {} 59 | 60 | 61 | --[[ Configuration ]]----------------------------------------------------------- 62 | -- * Allow user to resize window from the system window manager. 63 | -- Note: Recommended false. Has issues with some Linux window managers. 64 | local allow_window_resize = false 65 | 66 | -- * Apply changes to love's scaling and drawing settings. 67 | -- Turn off if you do not want pixel scaling on all objects by default. 68 | local apply_global_scaling_changes = true 69 | 70 | -- * When in full screen, only scale by integer. 71 | -- May lead to black borders around the whole screen. 72 | local pixel_perfect_fullscreen = false 73 | 74 | 75 | -- * Table defining all graphical cursors used. 76 | -- Format {Path to image, -X offset, -Y offset} 77 | -- If unused, change to an empty table. 78 | local cursor_table = { 79 | -- {"assets/texture/cursor/cursor1.png",0,0}, -- Commented out due to not being needed 80 | -- {"assets/texture/cursor/cursor2.png",5,0}, 81 | -- {"assets/texture/cursor/cursor3.png",0,0}, 82 | } 83 | 84 | 85 | -- * The current graphical cursor to use 86 | -- 0 is a blank cursor. 87 | m.current_cursor = 1 88 | 89 | -- * Show the OS cursor 90 | -- True = Show, False = Hide 91 | -- Applies on game start-up only. 92 | -- m.toggle_cursor() allows you to toggle after the game has loaded. 93 | m.show_system_cursor_startup = true 94 | 95 | --[[ End Configuration ]]------------------------------------------------------- 96 | 97 | -- * Functions * -- 98 | -- * Will use the max possible window scale if none is defined. 99 | function m.load(defaultScale) 100 | m.global_changes() 101 | m.create_pixel_mouse() 102 | m.canvas = love.graphics.newCanvas(base.width,base.height) -- Canvas used to display the game 103 | m.canvas2 = love.graphics.newCanvas(base.width,base.height) -- Secondary buffer used to apply shaders 104 | m.get_monitor_size() 105 | m.get_max_scale() 106 | m.get_full_screen_offset() 107 | defaultScale = defaultScale or m.maxWindowScale 108 | m.force_cursor(m.show_system_cursor_startup) 109 | m.set_game_scale(defaultScale) 110 | end 111 | 112 | -- * Apply Global Changes To Love2D 113 | function m.global_changes() 114 | if apply_global_scaling_changes then 115 | love.graphics.setDefaultFilter("nearest", "nearest", 1) 116 | love.graphics.setLineStyle("rough") 117 | end 118 | end 119 | 120 | -- * Creates the Pixel Mouse for calculations. 121 | function m.create_pixel_mouse() 122 | -- Creates the virtual mouse. 123 | m.mouse = { 124 | x = 0, 125 | y = 0 126 | } 127 | 128 | -- * Table, loads all cursors from cursor_table and assigned them as a new image. 129 | m.cursors = {} 130 | for k,v in pairs(cursor_table) do 131 | m.cursors[k] = love.graphics.newImage(v[1]) 132 | end 133 | end 134 | 135 | -- * Required Update Loop 136 | -- Updates offset and the pixel mouse position. 137 | function m.update(dt) 138 | m.update_pixel_mouse() 139 | m.get_full_screen_offset() 140 | end 141 | 142 | -- Returns the Base Height 143 | function m.base_height() 144 | return base.height 145 | end 146 | 147 | -- Returns the Base With 148 | function m.base_width() 149 | return base.width 150 | end 151 | 152 | 153 | -- * Calculates the monitor size and stores it for later use. 154 | -- Only calculates on the main screen, because that's 99% of what people use. 155 | function m.get_monitor_size() 156 | local width, height = love.window.getDesktopDimensions(1) 157 | m.monitor = { 158 | w = width, 159 | h = height 160 | } 161 | end 162 | 163 | 164 | -- * Calculates the max scale of the windowed game and full-screen game 165 | function m.get_max_scale() -- This is a much better way to do this. 166 | local floatWidth = m.monitor.w / base.width 167 | local floatHeight = m.monitor.h / base.height 168 | 169 | if floatHeight < floatWidth then 170 | m.maxScale = m.monitor.h / base.height 171 | -- Subtract 125 to adjust for taskbar 172 | m.maxWindowScale = math.floor((m.monitor.h - 125) / base.height) 173 | else 174 | m.maxScale = m.monitor.w / base.width 175 | -- Subtract 125 to adjust for taskbar 176 | m.maxWindowScale = math.floor((m.monitor.w - 125) / base.width) 177 | end 178 | end 179 | 180 | 181 | -- * Calculates the offset to draw the canvas in if full-screen. 182 | -- If it's not full-screen, don't bother with offset. 183 | function m.get_full_screen_offset(width, height) 184 | width = width or m.monitor.w 185 | height = height or m.monitor.h 186 | 187 | local full_scale = m.maxScale 188 | if pixel_perfect_fullscreen then 189 | full_scale = math.floor(m.maxScale) 190 | end 191 | 192 | local gameWidth = base.width * full_scale 193 | local blankWidth = width - gameWidth 194 | 195 | local gameHeight = base.height * full_scale 196 | local blankHeight = height - gameHeight 197 | 198 | m.offset = { 199 | x = math.floor(blankWidth/2), 200 | y = math.floor(blankHeight/2) 201 | } 202 | 203 | if love.window.getFullscreen() == false then 204 | m.offset = {x=0, y=0} 205 | end 206 | end 207 | 208 | -- * This function will put everything drawn after into Pixels scaling canvas. 209 | function m.start() 210 | love.graphics.setCanvas({m.canvas, stencil = true}) -- 11+ Requires Stencil = True 211 | love.graphics.clear(0,0,0,1) 212 | love.graphics.setColor(1,1,1,1) 213 | end 214 | 215 | 216 | -- * Put this after you are done drawing to return to the default canvas and 217 | -- draw the image scaled to the window. 218 | -- This will also apply any stacked shaders as well as the graphical cursor. 219 | function m.stop(hx, hy, hr, hsx, hsy) 220 | hx = hx or 0 221 | hy = hy or 0 222 | hr = hr or 0 223 | hsx = hsx or 0 224 | hsy = hsy or 0 225 | for i=1, #shader_pool do 226 | love.graphics.setCanvas({m.canvas2, stencil = true}) 227 | love.graphics.setShader(shader_pool[i]) 228 | love.graphics.draw(m.canvas) 229 | love.graphics.setShader() 230 | love.graphics.setCanvas({m.canvas, stencil = true}) 231 | love.graphics.draw(m.canvas2) 232 | end 233 | m.draw_after_shader() 234 | if m.current_cursor > 0 and m.current_cursor <= #m.cursors then -- If cursor is not 0 or not out of bounds, draw it. 235 | love.graphics.draw(m.cursors[m.current_cursor],m.mouse.x - cursor_table[m.current_cursor][2],m.mouse.y- cursor_table[m.current_cursor][3]) 236 | end 237 | love.graphics.setCanvas() 238 | love.graphics.draw(m.canvas, hx + m.offset.x , hy + m.offset.y, hr, hsx + m.scale, hsy + m.scale) 239 | end 240 | 241 | 242 | -- This function is called to resize the screen. 243 | function m.set_game_scale(newScale) 244 | m.scale = newScale 245 | love.window.setMode(base.width * m.scale, base.height * m.scale, {fullscreen = false, resizable = allow_window_resize, highdpi = false}) 246 | end 247 | 248 | 249 | -- This function is sets the game to full-screen or returns to windowed mode. 250 | function m.toggle_fullscreen() 251 | if love.window.getFullscreen() == false then 252 | local full_scale = m.maxScale 253 | if pixel_perfect_fullscreen then 254 | full_scale = math.floor(m.maxScale) 255 | end 256 | m.set_game_scale(full_scale) 257 | love.window.setFullscreen(true, "desktop") 258 | else 259 | m.set_game_scale(math.floor(m.maxWindowScale)) 260 | love.window.setFullscreen(false) 261 | end 262 | end 263 | 264 | 265 | -- This function will control resizing with the window. 266 | if allow_window_resize then 267 | function love.resize(w,h) 268 | print(w,h) 269 | if m.scale ~= m.maxScale then 270 | if base.width * m.scale < w then 271 | if m.scale + 1 < m.maxScale then 272 | m.scale = m.scale + 1 273 | m.set_game_scale(m.scale) 274 | else 275 | m.set_game_scale(m.scale) 276 | end 277 | elseif base.width * m.scale > w then 278 | if m.scale - 1 >= 1 then 279 | m.scale = m.scale - 1 280 | m.set_game_scale(m.scale) 281 | else 282 | m.set_game_scale(m.scale) 283 | end 284 | else 285 | m.set_game_scale(m.scale) 286 | end 287 | end 288 | end 289 | end 290 | 291 | 292 | 293 | -- Functions related to the Pixel Cursor. 294 | 295 | 296 | -- This updates the pixel mouse, replaces the love.mouse for checking for mouse 297 | -- position. 298 | function m.update_pixel_mouse() 299 | m.mouse = { 300 | x = math.floor((love.mouse.getX() - m.offset.x)/m.scale), 301 | y = math.floor((love.mouse.getY() - m.offset.y)/m.scale) 302 | } 303 | end 304 | 305 | 306 | -- This function toggles the system cursor. 307 | function m.toggle_cursor() 308 | love.mouse.setVisible(not love.mouse.isVisible()) 309 | end 310 | 311 | 312 | -- This function sets the system cursor. Uses true/false. 313 | function m.force_cursor(onoff) 314 | love.mouse.setVisible(onoff) 315 | end 316 | 317 | 318 | -- This function sets the graphical cursor, will not set an invalid cursor. 319 | function m.set_cursor(cursorNumber) 320 | if cursorNumber <= #m.cursors and cursorNumber >=0 then 321 | m.current_cursor = cursorNumber 322 | else 323 | print("Not a valid cursor number.") 324 | end 325 | end 326 | 327 | function m.get_cursor_count() 328 | return #cursor_table 329 | end 330 | 331 | 332 | -- Check to see if the pixel mouse in in a defined area. 333 | -- Uses a 3x3 hit rectangle if nothing is defined for the mouse. 334 | function m.mouse_over(local_x,local_y,local_width,local_height,mouse_x,mouse_y,mouse_width,mouse_height) 335 | mouse_width = mouse_width or 3 336 | mouse_height = mouse_height or 3 337 | mouse_x = mouse_x or m.mouse.x 338 | mouse_y = mouse_y or m.mouse.y 339 | return local_x < mouse_x + mouse_width and 340 | mouse_x < local_x + local_width and 341 | local_y < mouse_y + mouse_height and 342 | mouse_y < local_y + local_height 343 | end 344 | 345 | -- Apply a shader stack to the whole canvas. 346 | function m.push_shader(love_shader) 347 | shader_pool[#shader_pool+1] = love_shader 348 | end 349 | 350 | function m.pop_shader() 351 | shader_pool[#shader_pool] = nil 352 | end 353 | 354 | -- Clear all shaders. 355 | function m.clear_all_shader() 356 | shader_pool = {} 357 | end 358 | 359 | -- Shader Count 360 | function m.count_shader() 361 | return #shader_pool 362 | end 363 | 364 | -- Draw function to do after shaders have been processed. 365 | function m.change_draw_after_shader(a_function) 366 | if type(a_function) == "function" then 367 | m.after_shader_function = a_function 368 | else 369 | dprint("Not a function.") 370 | end 371 | end 372 | 373 | -- Clear the function. 374 | function m.clear_draw_after_shader() 375 | function m.after_shader_function() 376 | -- Blank by default 377 | end 378 | end 379 | 380 | -- The default function 381 | function m.after_shader_function() 382 | -- Blank by default 383 | end 384 | 385 | -- The function that's placed in the pixels:stop function 386 | function m.draw_after_shader() 387 | if type(m.after_shader_function) == "function" then 388 | m.after_shader_function() 389 | end 390 | end 391 | 392 | -- Quick Canvas Snapshot Functions 393 | 394 | 395 | -- Name of table to hold canvas screenshots 396 | local name_screenshots = "screenshot_table" 397 | m[name_screenshots] = {} 398 | 399 | 400 | -- Capture a screenshot, with a name. 401 | -- Note, does not last past the game closing. 402 | function m.capture_canvas(name) 403 | name = name or "default" 404 | local capture = m.canvas:newImageData( 1, 1, 0, 0, base.width, base.height ) 405 | m[name_screenshots][name] = love.graphics.newImage(capture) 406 | end 407 | 408 | 409 | -- Erases all screenshots 410 | function m.flush_capture() 411 | m[name_screenshots] = {} 412 | end 413 | 414 | 415 | -- Erases a screenshot. 416 | function m.remove_capture(name) 417 | name = name or "default" 418 | m[name_screenshots][name] = nil 419 | end 420 | 421 | 422 | -- Check to see if the screenshot/bank exists, recommended before trying to draw 423 | function m.check_capture(name) 424 | name = name or "default" 425 | if m[name_screenshots][name] ~= nil then return true else return false end 426 | end 427 | 428 | 429 | -- Check to see if the screenshot/bank exists, recommended before trying to draw 430 | function m.draw_capture(name, ...) 431 | name = name or "default" 432 | if m.check_capture(name) then 433 | love.graphics.draw(m[name_screenshots][name], unpack({...})) 434 | end 435 | end 436 | 437 | 438 | return m 439 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # SYSL-Text 2 | **Please see the "main.lua" for samples, please review the library for all the possible tags.** 3 | 4 | ![Quick Demo of Examples](/screenshots/ex.gif?raw=true "Quick Demo of Examples") 5 | 6 | # Update Notes 7 | * New: You can now pass a table to modify character widths, in case your font does something like move the j or q in one pixel. (See example 10) 8 | * New: You can now pass tables to the Audio/Font/Image/Etc commands if you don't keep resources global 9 | * New ```[scroll]``` command, will scroll the text up by line-height or a set value. Works well with ```love.graphics.setScissor```. 10 | * You have access to the basic calculated width, height and linecount for each textbox. Access is under the ```get``` table. 11 | - ```my_cool_textbox.get.width, my_cool_textbox.get.height, my_cool_textbox.get.lines ``` 12 | - If you are using autowrap, the width calculation is more accurate. 13 | * Text animation commands now allow you to change the speed, or even reverse it. 14 | * It is no longer required to wrap UTF8 characters. You can send them without the wrapping and the library will scan and wrap extended characters without any manual input. 15 | 16 | # Setup 17 | ## Adding the library to your project 18 | ```lua 19 | -- Require the library in your project 20 | Text = require(text.lua) 21 | ``` 22 | ## Create your first textbox 23 | ```lua 24 | -- Require the library in your project 25 | my_cool_textbox = Text.new() 26 | ``` 27 | ## Apply text to your textbox 28 | ```lua 29 | -- Require the library in your project 30 | my_cool_textbox:send("Oh, gee, I hope this print out one by one!") 31 | ``` 32 | ## Let love2d know to draw your textbox 33 | ```lua 34 | -- in love.draw() 35 | -- my_cool_textbox:draw(x,y) 36 | my_cool_textbox:draw(0,0) 37 | ``` 38 | ## Let love2d know to update your textbox 39 | ```lua 40 | -- in love.update(dt) 41 | my_cool_textbox:update(dt) 42 | ``` 43 | 44 | # Tags 45 | SYSL-Text supports tags in ```[these brackets]``` and will use them to apply effects to your rendered text. SYSL-Text also supports defining default styles per textbox. Please take a look at the examples below. **Please note that effects and style are only examples, the library does not provide backgrounds or textboxes.** 46 | 47 | ## Tags with Screenshot Examples 48 | ![Example 1](/screenshots/01.gif?raw=true "Example of Library") 49 | ```lua 50 | example2box = Text.new("left", 51 | { 52 | color = {1,1,1,1}, 53 | shadow_color = {0.5,0.5,1,0.4}, 54 | font = Fonts.golden_apple, 55 | character_sound = true, 56 | adjust_line_height = -3 57 | }) 58 | example2box:send("• Do you like eggs?[newline]• I think they are [pad=6]eggzelent![audio=sfx=laugh]", 100, false) 59 | ``` 60 | ![Example 2](/screenshots/02.gif?raw=true "Example of Library") 61 | ```lua 62 | example3box = Text.new("left", 63 | { 64 | color = {1,1,1,1}, 65 | shadow_color = {0.5,0.5,1,0.4}, 66 | font = Fonts.golden_apple, 67 | character_sound = false, 68 | print_speed = 0.02, 69 | adjust_line_height = -3 70 | }) 71 | example3box:send("I am a very cute [color=#00ff00]green frog[/color]. Would you like to eat dinner with me? It's [rainbow][bounce]fresh[/bounce] [u]fly[/u] [shake]soup[/shake]![/rainbow]", 316, false) 72 | ``` 73 | ![Example 3](/screenshots/3.png?raw=true "Example of Library") 74 | ```lua 75 | example4box = Text.new("left", 76 | { 77 | color = {0,0,0,0.95}, 78 | shadow_color = {0.5,0.5,1,0.4}, 79 | font = Fonts.earth_illusion, 80 | adjust_line_height = -2 81 | }) 82 | example4box:send("[dropshadow=2][b]Old Man:[/b][newline]Hello young man. How are you?", 74, true) 83 | ``` 84 | ![Example 4](/screenshots/4.png?raw=true "Example of Library") 85 | ```lua 86 | example6box = Text.new("left", 87 | { 88 | color = {0.9,0.9,0.9,0.95}, 89 | shadow_color = {0.5,0.5,1,0.4}, 90 | font = Fonts.comic_neue, character_sound = true, 91 | sound_every = 5, 92 | sound_number = 2 93 | }) 94 | example6box:send("Oh wow, you found the [bounce][rainbow]high-res[/rainbow][/bounce] text! [icon=1][icon=2][icon=3][icon=4] [icon=5][icon=6][icon=7][icon=8] [icon=9][icon=10][icon=11][icon=12][/]", 320*4-16, true) 95 | ``` 96 | ![Example 5](/screenshots/5.gif?raw=true "Example of Library") 97 | ```lua 98 | example7box = Text.new("left", 99 | { 100 | color = {0.9,0.9,0.9,0.95}, 101 | shadow_color = {0.5,0.5,1,0.4}, 102 | font = Fonts.comic_neue_big, 103 | character_sound = true, 104 | sound_every = 3, 105 | sound_number = 3 106 | }) 107 | example7box:send("[warble=-5][textspeed=0.02][image=witch][pad=32]There's something I have to say,[pause=0.7] [warble=5]this witch will save the day!", 320*4-16, false) 108 | ``` 109 | ![Example 6](/screenshots/6.gif?raw=true "Example of Library") 110 | ```lua 111 | example8box = Text.new("left", 112 | { 113 | color = {0.9,0.9,0.9,0.95}, 114 | shadow_color = {0.5,0.5,1,0.4}, 115 | font = Fonts.comic_neue_small, 116 | character_sound = true, 117 | print_speed = 0.04, 118 | sound_every = 2, 119 | sound_number = 4 120 | }) 121 | example8box:send("[function=example.bop=true]Did you hear about the [color=#FF0000]bad puns?[/color][pause=0.5] You did?![pause=0.5] That's [color=#FFFF00]great[/color]![pause=0.8] [shake]Now I don't have to tell you about them![/shake][pause=1][function=example.bop=false][audio=sfx=laugh]", 320-80, false) 122 | ``` 123 | ![Example 7](/screenshots/7.gif?raw=true "Example of Library") 124 | ```lua 125 | example5box = Text.new("left", 126 | { 127 | color = {0.9,0.9,0.9,0.95}, 128 | shadow_color = {0.5,0.5,1,0.4}, 129 | font = Fonts.earth_illusion, 130 | character_sound = true, 131 | sound_every = 5, 132 | sound_number = 2, 133 | adjust_line_height = -2, 134 | }) 135 | example5box:send("[dropshadow=3][function=example.ex5_textboxsize=64][textspeed=0.02]With the Power of Queens, they challenged the Snakes. Garry's mighty waves peeled apart their diamond scales. The Wizards woke[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]mighty windstorms. Niza brought the deadly wine[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]and cheese. [audio=sfx=ui]", 320-16, false) 136 | 137 | ``` 138 | ![Example 8](/screenshots/8.gif?raw=true "Example of Library") 139 | ```lua 140 | example9box = Text.new("left", 141 | { 142 | color = {0.9,0.9,0.9,0.95}, 143 | shadow_color = {0.5,0.5,1,0.4}, 144 | font = Fonts.comic_neue_small, 145 | character_sound = true, 146 | print_speed = 0.04, 147 | sound_every = 2, 148 | sound_number = 4 149 | }) 150 | example9box:send("Hello! Welcome to the world of Pocket Creatures![waitforinput][scroll][newline]My name is Professor Tree![newline][waitforinput][scroll][scroll]And you are?", 150, false) 151 | 152 | 153 | ``` 154 | # Default Textbox Settings 155 | ```lua 156 | local default_settings = { 157 | autotags = "[tab]", -- This string is added at the start of every textbox, can include tags. 158 | font = font.default, -- Default font for the textbox, love font object. 159 | color = {1,1,1,1}, -- Default text color. 160 | shadow_color = {1,1,1,1}, -- Default Drop Shadow Color. 161 | print_speed = 0.2, -- How fast text prints. 162 | adjust_line_height = 0, -- Adjust the default line spacing. 163 | default_strikethrough_position = 0, -- Adjust the position of the strikethough line. 164 | default_underline_position = 0, -- Adjust the position of the underline line. 165 | character_sound = false, -- Use a voice when printing characters? True or false. 166 | sound_number = 0, -- What voice to use when printing characters. 167 | sound_every = 2, -- How many characters to wait before making another noise when printing text. 168 | default_warble = 0 -- How much to adjust the voice when printing each character. 169 | } 170 | -- You can set some defaults for each textbox object to make things easier. 171 | textbox = Text.new("left", default_settings) 172 | ``` 173 | # Textbox Information 174 | ## Width, Height, Lines 175 | You can get the width, height and the number of lines after sending text to a textbox. 176 | ```lua 177 | my_cool_textbox = Text.new() 178 | 179 | my_cool_textbox:send("Oh, gee, I hope this print out one by one!") 180 | local textbox_x = 0 181 | local textbox_y = 0 182 | local textbox_w = my_cool_textbox.get.width 183 | local textbox_h = my_cool_textbox.get.height 184 | local textbox_l = my_cool_textbox.get.lines 185 | -- in love.draw() 186 | love.graphics.rectangle("fill", textbox_x, textbox_y, textbox_w, textbox_h) 187 | my_cool_textbox:draw(textbox_x, textbox_y) 188 | ``` 189 | # is_finished() 190 | Returns ```true``` if the textbox is done printing, or ```false``` if the textbox is still printing. 191 | 192 | It will also return as ```true``` if ```[waitforinput]``` is in the text string. 193 | ```lua 194 | are_you_done = my_cool_textbox:is_finished() 195 | ``` 196 | 197 | # continue() 198 | Continue will continue printing after ```[waitforinput]``` pauses it. 199 | 200 | ```lua 201 | -- You only need to send this once. 202 | my_cool_textbox:continue() 203 | ``` 204 | 205 | # Tag Notes 206 | Some tags will not work until you let the library know something about your game. 207 | 208 | # 1.9 Update - Tags 209 | You can now pass a table instead of a string, this will allow you to use a table of assets without using global assets. 210 | 211 | ## Audio 212 | ```lua 213 | --Text.configure.audio_table(table_string) 214 | Text.configure.audio_table("Audio") 215 | ``` 216 | This configuration item will pass along the Lua table you are using to store audio sources. It currently can search down one level from that base table. 217 | ```lua 218 | Enables "[audio]": Starts playing an audio source. 219 | Used like: "[audio=guy-laughing]" or "[audio=music=level1]" 220 | 221 | Enables "[/audio]": Stops playing an audio source. 222 | Used like: "[/audio=guy-laughing]" or "[/audio=music=level1]" 223 | ``` 224 | 225 | ## Audio-Sound per character 226 | ```lua 227 | --Text.configure.add_text_sound(sound, volume) 228 | Text.configure.add_text_sound(Audio.text.default, 0.2) 229 | ``` 230 | This will allow you to add voices so textboxes will jabber at you as they print characters. Note that the following commands will not work until you set up this configuration. 231 | ```lua 232 | Enables: 233 | "[voice=#]": Set the speaking voice, 0 will turn it off. 234 | "[warble=#]": Set the pitch varience, +/- on the voice. 235 | "[/warble]": Stops the pitch varience. 236 | "[soundevery=#]": How often does a sound play per character. 237 | "[/soundevery]": Reset the sound per character. 238 | 239 | Used like: "[voice=2][warble=3][soundevery=1]I'm talking really fast and making a lot of noise![voice=0][/warble][/soundevery]" 240 | ``` 241 | 242 | ## Fonts 243 | ```lua 244 | --Text.configure.font_table(table_string) 245 | Text.configure.font_table("Font") 246 | ``` 247 | This configuration item will pass along the Lua table you are using to store your Font sources. 248 | ```lua 249 | Enables "[font=Font.name]": Set the font. 250 | Used like: "[font=Font.ComicSansMs]" or "[font=Font.default]" 251 | 252 | Enables "[/font]": Set the font back to the textbox default. 253 | Used like: "[/font]" 254 | ``` 255 | ## Images 256 | ```lua 257 | --Text.configure.image_table(table_string) 258 | Text.configure.image_table("img") 259 | ``` 260 | This configuration item will pass along the Lua table you are using to store image sources. It currently can search down one level from that base table. 261 | ```lua 262 | Enables "[image=name]": Draw an image inline with the text. 263 | Used like: "[image=skull]" or "[image=ui=skull] 264 | ``` 265 | ## Icons 266 | ```lua 267 | --Text.configure.icon_table(table_string) 268 | Text.configure.icon_table("Icon") 269 | ``` 270 | This configuration item will pass along the Lua table you are using to hold an icon drawing library. Note that this function assumes your library has a .draw() and .count() available. .draw() would work similar to how love.graphics.draw() works, with the source being replaced by a number. .count() would just return the number of available icons. If you would prefer to just use images, you can leave this configuration out and use the "[image]" tag. 271 | ```lua 272 | Enables "[icon=#]": Draw an icon inline with the text. 273 | Used like: "[icon=1] 274 | ``` 275 | 276 | ## Palettes 277 | ```lua 278 | --Text.configure.palette_table(table_string) 279 | Text.configure.palette_table("Palettes") 280 | ``` 281 | This configuration item will pass along the Lua table you are using to hold an indexed list of palettes. You can then use this prebuilt index instead of "[color=#hexval]". 282 | ```lua 283 | Enables "[color=#]": Changed the color of the text based on a palette list. 284 | Used like: "[color=1] 285 | ``` 286 | 287 | ## Shader Effects 288 | ```lua 289 | --Text.configure.shader_table(table_string) 290 | Text.configure.shader_table("Shaders") 291 | ``` 292 | This configuration item will pass along the Lua table you are using to hold shader functions you have created. These shader functions can be then applied directly to the text. 293 | ```lua 294 | Enables "[shader=name]": Apply effects on text from a shader. 295 | Used like: "[shader=blur] 296 | ``` 297 | 298 | ## Scripting Commands 299 | ```lua 300 | --Text.configure.function_command_enable(enable_bool) 301 | Text.configure.function_command_enable(enable_bool) 302 | ``` 303 | This nightmare will allow you to write direct lua code into a string to execute. It's off by default. Please be careful when using. **Do not use unless you sandbox your text.** 304 | 305 | # Standard Tags 306 | ## Not Animated 307 | ### end 308 | ```lua 309 | "[end]" -- System tag, added to the end of every string. 310 | ``` 311 | ### waitforinput 312 | ```lua 313 | "[waitforinput]" -- Pauses printing characters until the 314 | -- Text:continue() command is sent from somewhere in your code. 315 | ``` 316 | ### newline 317 | ```lua 318 | "[newline]" -- Start printing on a new line, added automatically when autowrap is on. 319 | ``` 320 | ### cursorsave 321 | ```lua 322 | "[cursorsave]" -- Save the current location of where we are typing to in the textbox. 323 | ``` 324 | ### cursorload 325 | ```lua 326 | "[cursorload]" -- Restore the current location of where we are typing to in the textbox from when we last saved with [cursorsave]. 327 | ``` 328 | ### cursorx 329 | ```lua 330 | "[cursorx=number]" -- Set the cursor position as Textbox X position + x 331 | ``` 332 | ### cursory 333 | ```lua 334 | "[cursory=number]" -- Set the cursor position as Textbox Y position + y 335 | ``` 336 | ### tab 337 | ```lua 338 | "[tab]" -- Pad 4 spaces. Same as " ". 339 | ``` 340 | ### pad 341 | ```lua 342 | "[pad=number]" -- Pad this many pixels. 343 | ``` 344 | ### lineheight 345 | ```lua 346 | "[lineheight=number]" -- Set the height for each line to this many pixels. 347 | ``` 348 | ### skip 349 | ```lua 350 | "[skip]" -- Skip rendering the remaining characters character by character, draw the full text. 351 | ``` 352 | ### pause 353 | ```lua 354 | "[pause]" -- Wait this many seconds (can use 0. for less than one second). Does not do anything if textbox is set to show everything. May interact badly with skip. 355 | ``` 356 | ### backspace 357 | ```lua 358 | "[backspace=number]" -- Erase this many printed characters and start printing from that point. Very fragile, do not backspace over commands. 359 | ``` 360 | ### textspeed 361 | ```lua 362 | "[textspeed=number]" -- Change how fast text is printed, wait this long in seconds before printing the next character. 0.2 is the default. 363 | ``` 364 | ### /textspeed 365 | ```lua 366 | "[/textspeed]" -- Reset textspeed to the default 367 | ``` 368 | ### color 369 | ```lua 370 | "[color=#BEEEEF]" -- Set color to the hex color. 371 | ``` 372 | ### /color 373 | ```lua 374 | "[/color]" -- Reset to the default color. 375 | ``` 376 | ### shadowcolor 377 | ```lua 378 | "[shadowcolor=#BEEEEF]" -- Set shadow color to the hex color. 379 | ``` 380 | ### /shadowcolor 381 | ```lua 382 | "[/shadowcolor]" -- Reset to the default shadow color. 383 | ``` 384 | ### dropshadow 385 | ![Example 8](/screenshots/dropshadow.png?raw=true "Example of Dropshadow") 386 | ```lua 387 | "[dropshadow=number]" -- Draw a dropshadow behind the text 388 | -- 1 - Lower Left 389 | -- 2 - Below 390 | -- 3 - Lower Right 391 | -- 4 - Left 392 | -- 5 - Thin Outline 393 | -- 6 - Right 394 | -- 7 - Upper Left 395 | -- 8 - Above 396 | -- 9 - Upper Right 397 | -- 10 - Thick Outline 398 | ``` 399 | ### /dropshadow 400 | ```lua 401 | "[/dropshadow]" -- Turn off dropshadow. 402 | ``` 403 | ### scale 404 | ```lua 405 | "[scale=number]" -- Scale the text. 406 | ``` 407 | ### /scale 408 | ```lua 409 | "[/scale]" -- Reset the scale. 410 | ``` 411 | ### rotate 412 | ![Example 9](/screenshots/rotate.png?raw=true "Example of Rotate") 413 | ```lua 414 | "[rotate=number]" -- Rotate the text characters. 415 | ``` 416 | ### /rotate 417 | ```lua 418 | "[/rotate]" -- Reset the rotation. 419 | ``` 420 | ### b, i, u, s 421 | ![Example 11](/screenshots/bius.png?raw=true "Example of bius") 422 | ```lua 423 | "[b]BOLD[/b]" -- Fake Bold. 424 | "[i]ITALICS[/i]" -- Fake Italics. 425 | "[u]UNDERLINE[/u]" -- Underline. 426 | "[s]STRIKETHROUGH[/s]" -- Strikethrough. 427 | -- Note, you can adjust the position of the line of underline and strikethough by doing [u=number]/[s=number] positive or negative. 428 | -- Some fonts do not report height as nice as it could. 429 | -- You can also set the default for the new textbox so you do not have to do this for each underline and strikethrough. 430 | ``` 431 | ### mirror 432 | ![Example 10](/screenshots/mirror.png?raw=true "Example of Mirror") 433 | ```lua 434 | "[mirror=number]" -- Print text reversed. 435 | ``` 436 | ### /mirror 437 | ```lua 438 | "[/mirror]" -- Stop the reverse. 439 | ``` 440 | ## Animated Tags 441 | Note, all numbers are optional. You can use the ```[tag]``` without them, it will use the default speed. 442 | 443 | ![Example 10](/screenshots/effects.gif?raw=true "Example of Rotate") 444 | ### shake 445 | ```lua 446 | "[shake=number]Shake[/shake]" 447 | ``` 448 | ### spin 449 | ```lua 450 | "[spin=number]spin[/spin]" 451 | ``` 452 | ### swing 453 | ```lua 454 | "[swing=number]swing[/swing]" 455 | ``` 456 | ### raindrop 457 | ```lua 458 | "[raindrop=number]raindrop[/raindrop]" 459 | ``` 460 | ### bounce 461 | ```lua 462 | "[bounce=number]bounce[/bounce]" 463 | ``` 464 | ### blink 465 | ```lua 466 | "[blink=number]blink[/blink]" 467 | ``` 468 | ### rainbow 469 | ```lua 470 | "[rainbow=number(speed)=number(brightness of color)]rainbow[/rainbow]" 471 | ``` 472 | ### scroll 473 | ```lua 474 | "[scroll] or [scroll=-int]" -- Scrolls the text in the textbox. 475 | ``` 476 | 477 | -------------------------------------------------------------------------------- /example/font/earth_illusion.fnt: -------------------------------------------------------------------------------- 1 | info face="Earth Illusion" size=22 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=2,2,2,2 spacing=2,1 outline=0 2 | common lineHeight=19 base=18 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 3 | page id=0 file="earth_illusion_0.png" 4 | chars count=214 5 | char id=-1 x=91 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 6 | char id=32 x=241 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 7 | char id=33 x=26 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 8 | char id=34 x=217 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 9 | char id=35 x=286 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 10 | char id=36 x=0 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 11 | char id=37 x=70 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 12 | char id=38 x=192 y=0 width=14 height=26 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 13 | char id=39 x=503 y=0 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 14 | char id=40 x=193 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 15 | char id=41 x=181 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 16 | char id=42 x=256 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 17 | char id=43 x=271 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 18 | char id=44 x=98 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 19 | char id=45 x=176 y=0 width=14 height=26 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 20 | char id=46 x=206 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 21 | char id=47 x=301 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 22 | char id=48 x=39 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 23 | char id=49 x=412 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 24 | char id=50 x=91 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 25 | char id=51 x=104 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 26 | char id=52 x=294 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 27 | char id=53 x=117 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 28 | char id=54 x=143 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 29 | char id=55 x=350 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 30 | char id=56 x=363 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 31 | char id=57 x=376 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 32 | char id=58 x=179 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 33 | char id=59 x=188 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 34 | char id=60 x=238 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 35 | char id=61 x=208 y=0 width=14 height=26 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 36 | char id=62 x=475 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 37 | char id=63 x=389 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 38 | char id=64 x=224 y=0 width=14 height=26 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 39 | char id=65 x=14 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 40 | char id=66 x=402 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 41 | char id=67 x=415 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 42 | char id=68 x=428 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 43 | char id=69 x=441 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 44 | char id=70 x=454 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 45 | char id=71 x=467 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 46 | char id=72 x=480 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 47 | char id=73 x=489 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 48 | char id=74 x=493 y=27 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 49 | char id=75 x=240 y=0 width=14 height=26 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 50 | char id=76 x=0 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 51 | char id=77 x=182 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 52 | char id=78 x=196 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 53 | char id=79 x=13 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 54 | char id=80 x=26 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 55 | char id=81 x=39 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 56 | char id=82 x=52 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 57 | char id=83 x=65 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 58 | char id=84 x=455 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 59 | char id=85 x=78 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 60 | char id=86 x=280 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 61 | char id=87 x=308 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 62 | char id=88 x=91 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 63 | char id=89 x=104 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 64 | char id=90 x=117 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 65 | char id=91 x=30 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 66 | char id=92 x=331 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 67 | char id=93 x=50 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 68 | char id=94 x=130 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 69 | char id=95 x=143 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 70 | char id=96 x=313 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 71 | char id=97 x=84 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 72 | char id=98 x=156 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 73 | char id=99 x=169 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 74 | char id=100 x=182 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 75 | char id=101 x=195 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 76 | char id=102 x=208 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 77 | char id=103 x=221 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 78 | char id=104 x=234 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 79 | char id=105 x=80 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 80 | char id=106 x=171 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 81 | char id=107 x=247 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 82 | char id=108 x=125 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 83 | char id=109 x=391 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 84 | char id=110 x=260 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 85 | char id=111 x=273 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 86 | char id=112 x=286 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 87 | char id=113 x=299 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 88 | char id=114 x=312 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 89 | char id=115 x=325 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 90 | char id=116 x=338 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 91 | char id=117 x=351 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 92 | char id=118 x=364 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 93 | char id=119 x=336 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 94 | char id=120 x=377 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 95 | char id=121 x=390 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 96 | char id=122 x=403 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 97 | char id=123 x=0 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 98 | char id=124 x=197 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 99 | char id=125 x=60 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 100 | char id=126 x=125 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 101 | char id=161 x=467 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 102 | char id=162 x=210 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 103 | char id=163 x=416 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 104 | char id=164 x=429 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 105 | char id=165 x=442 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 106 | char id=166 x=116 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 107 | char id=167 x=455 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 108 | char id=168 x=468 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 109 | char id=169 x=74 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 110 | char id=170 x=253 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 111 | char id=171 x=266 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 112 | char id=172 x=481 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 113 | char id=173 x=494 y=54 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 114 | char id=174 x=142 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 115 | char id=175 x=0 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 116 | char id=176 x=13 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 117 | char id=177 x=26 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 118 | char id=178 x=20 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 119 | char id=179 x=10 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 120 | char id=180 x=40 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 121 | char id=181 x=42 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 122 | char id=182 x=39 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 123 | char id=183 x=89 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 124 | char id=184 x=500 y=108 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 125 | char id=185 x=107 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 126 | char id=186 x=70 y=135 width=8 height=26 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 127 | char id=187 x=168 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 128 | char id=188 x=52 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 129 | char id=189 x=65 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 130 | char id=190 x=78 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 131 | char id=191 x=91 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 132 | char id=192 x=112 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 133 | char id=193 x=98 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 134 | char id=194 x=56 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 135 | char id=195 x=322 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 136 | char id=196 x=489 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 137 | char id=197 x=461 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 138 | char id=198 x=38 y=0 width=16 height=26 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 139 | char id=199 x=104 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 140 | char id=200 x=117 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 141 | char id=201 x=130 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 142 | char id=202 x=143 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 143 | char id=203 x=156 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 144 | char id=204 x=423 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 145 | char id=205 x=434 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 146 | char id=206 x=445 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 147 | char id=207 x=456 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 148 | char id=208 x=28 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 149 | char id=209 x=405 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 150 | char id=210 x=169 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 151 | char id=211 x=182 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 152 | char id=212 x=195 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 153 | char id=213 x=208 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 154 | char id=214 x=221 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 155 | char id=215 x=224 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 156 | char id=216 x=108 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 157 | char id=217 x=234 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 158 | char id=218 x=247 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 159 | char id=219 x=260 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 160 | char id=220 x=273 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 161 | char id=221 x=286 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 162 | char id=222 x=205 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 163 | char id=223 x=433 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 164 | char id=224 x=252 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 165 | char id=225 x=154 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 166 | char id=226 x=140 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 167 | char id=227 x=419 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 168 | char id=228 x=126 y=27 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 169 | char id=229 x=447 y=0 width=12 height=26 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 170 | char id=230 x=20 y=0 width=16 height=26 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 171 | char id=231 x=299 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 172 | char id=232 x=312 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 173 | char id=233 x=325 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 174 | char id=234 x=338 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 175 | char id=235 x=351 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 176 | char id=236 x=368 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 177 | char id=237 x=379 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 178 | char id=238 x=478 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 179 | char id=239 x=401 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 180 | char id=240 x=364 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 181 | char id=241 x=377 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 182 | char id=242 x=390 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 183 | char id=243 x=403 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 184 | char id=244 x=416 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 185 | char id=245 x=429 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 186 | char id=246 x=442 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 187 | char id=247 x=229 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 188 | char id=248 x=346 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 189 | char id=249 x=468 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 190 | char id=250 x=481 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 191 | char id=251 x=494 y=81 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 192 | char id=252 x=0 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 193 | char id=253 x=156 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 194 | char id=254 x=289 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 195 | char id=255 x=13 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 196 | char id=305 x=161 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 197 | char id=338 x=56 y=0 width=16 height=26 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 198 | char id=339 x=159 y=0 width=15 height=26 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 199 | char id=710 x=52 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 200 | char id=730 x=65 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 201 | char id=732 x=78 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 202 | char id=8211 x=324 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 203 | char id=8212 x=361 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 204 | char id=8216 x=134 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 205 | char id=8217 x=143 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 206 | char id=8218 x=152 y=135 width=7 height=26 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 207 | char id=8220 x=169 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 208 | char id=8221 x=301 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 209 | char id=8222 x=277 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 210 | char id=8226 x=335 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 211 | char id=8230 x=376 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 212 | char id=8249 x=346 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 213 | char id=8250 x=357 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 214 | char id=8260 x=0 y=0 width=18 height=26 xoffset=-2 yoffset=-2 xadvance=14 page=0 chnl=15 215 | char id=8308 x=390 y=108 width=9 height=26 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 216 | char id=8364 x=130 y=108 width=11 height=26 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 217 | char id=8722 x=265 y=108 width=10 height=26 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 218 | char id=8725 x=316 y=0 width=13 height=26 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 219 | -------------------------------------------------------------------------------- /example/main.lua: -------------------------------------------------------------------------------- 1 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 2 | -- Extra Libraries used for examples 3 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 4 | -- SLog Screen Scaling Library 5 | -- Used for pixel art examples, works fine without it. 6 | Screen = require("library.slog-pixel"); 7 | Screen.load(4) 8 | 9 | -- SLog Frame Library 10 | -- Used for pixel art examples, works fine without it. 11 | Frame = require("library.slog-frame"); 12 | 13 | -- SLog Icon Library 14 | -- Used for icon drawing, works fine without it. 15 | Icon = require("library.slog-icon"); 16 | 17 | 18 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 19 | -- The real library 20 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 21 | -- SLog Text Library 22 | Text = require("library.slog-text") 23 | 24 | --[[------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------]]-- 25 | -- Config - Advanced Scripting 26 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 27 | -- Enable Advanced Scripting with the [function=lua code] command. 28 | -- Off by default. 29 | Text.configure.function_command_enable(true) 30 | 31 | -- Create fonts for testing 32 | Fonts = { 33 | default = love.graphics.newFont(16), 34 | earth_illusion = love.graphics.newFont("font/earth_illusion.fnt", "font/earth_illusion.png"), 35 | golden_apple = love.graphics.newFont("font/golden_apple.fnt", "font/golden_apple.png"), 36 | comic_neue = love.graphics.newFont("font/comic_neue_bold_19.ttf",16), 37 | comic_neue_small = love.graphics.newFont("font/comic_neue_13.ttf",11, "mono" ), 38 | comic_neue_big = love.graphics.newFont("font/comic_neue_bold_19.ttf",32), 39 | shinonome_12 = love.graphics.newFont("font/shinonome_12.ttf", 12), 40 | shinonome_14 = love.graphics.newFont("font/shinonome_14.ttf", 14), 41 | shinonome_16 = love.graphics.newFont("font/shinonome_16.ttf", 16), 42 | monogram_extended_custom = love.graphics.newFont("font/monogram_extended_custom.ttf", 32), 43 | } 44 | -- Set the default font 45 | love.graphics.setFont(Fonts.default) 46 | 47 | print("Kernign Test, custom, ij", Fonts.monogram_extended_custom:getKerning("i", "j")) 48 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 49 | -- Config - font_table 50 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 51 | -- Now that we set our fonts, let's pass it to the library. 52 | -- Note, we pass it as a string, it will automaticly convert to a table in the library. 53 | -- The library will work without setting a font_table, but this allows us to use the [font] command. 54 | Text.configure.font_table("Fonts") 55 | 56 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 57 | -- Load Images for testing 58 | images = {} 59 | images.bg = love.graphics.newImage("images/bg.png") 60 | images.tango = love.graphics.newImage("images/tangoicons.png") 61 | images.witch = love.graphics.newImage("images/pixabaywitch.png") 62 | images.neue = love.graphics.newImage("images/pixabayneue.png") 63 | 64 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 65 | -- Set up frames for examples 66 | images.frame = {} 67 | images.frame.default_8 = love.graphics.newImage("images/frame/default_8.png") 68 | images.frame.eb_8 = love.graphics.newImage("images/frame/eb_8.png") 69 | images.frame.m3_8 = love.graphics.newImage("images/frame/m3_8.png") 70 | images.frame.cart_8 = love.graphics.newImage("images/frame/cart_8.png") 71 | images.frame.bubble_8 = love.graphics.newImage("images/frame/bubble_8.png") 72 | images.frame.ff_8 = love.graphics.newImage("images/frame/ff_8.png") 73 | images.frame.blk_8 = love.graphics.newImage("images/frame/blk_8.png") 74 | images.frame.bk_32 = love.graphics.newImage("images/frame/bk_24.png") 75 | images.frame.utp_8 = love.graphics.newImage("images/frame/utp_8.png") 76 | 77 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 78 | -- Config - image_table 79 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 80 | -- Now that we set our images, let's pass it to the library. 81 | -- Note, we pass it as a string, it will automaticly convert to a table in the library. 82 | -- The library will work without it, but without the ability to draw images directly with the [image=name] command 83 | Text.configure.image_table("images") 84 | 85 | 86 | -- Set up icons 87 | Icon.configure(16, images.tango) 88 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 89 | -- Config - icon_table 90 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 91 | -- Now that we set our icons, let's pass it to the library. 92 | -- Note, we pass it as a string, it will automaticly convert to a table in the library. 93 | -- The library will work without it, but without the ability to draw images directly with the [icon=name] command 94 | -- Note, the library assumes the table has a count() to return the number of functions, and a draw() that works like love.graphics.draw() 95 | -- with a number replacing the source image. 96 | Text.configure.icon_table("Icon") 97 | 98 | 99 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 100 | -- SLog Frame Library has to load after setting up all the frames, library used to draw the background boxes for text. 101 | Frame.load() 102 | 103 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 104 | -- Load Audio for testing 105 | Audio = {} 106 | Audio.text = {} 107 | Audio.text.default = love.audio.newSource("audio/text/default.ogg", "static") 108 | Audio.text.typing = love.audio.newSource("audio/text/typing.ogg", "static") 109 | Audio.text.cackle = love.audio.newSource("audio/text/cackle.ogg", "static") 110 | Audio.text.neue = love.audio.newSource("audio/text/neue.ogg", "static") 111 | Audio.sfx = {} 112 | Audio.sfx.laugh = love.audio.newSource("audio/sfx/voice_fun_man_character_deep_laugh_11.ogg", "static") 113 | Audio.sfx.laugh:setVolume(0.3) 114 | Audio.sfx.ui = love.audio.newSource("audio/sfx/Selection_Ukelele chord 04_mod.ogg", "static") 115 | Audio.sfx.ui:setVolume(0.3) 116 | 117 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 118 | -- Config - audio_table 119 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 120 | -- Now that we set our audio, let's pass it to the library. 121 | -- Note, we pass it as a string, it will automaticly convert to a table in the library. 122 | -- The library will work without it, but without the ability to draw images directly with the [audio=table=source] command 123 | Text.configure.audio_table("Audio") 124 | 125 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 126 | -- Config - Text-Tones 127 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 128 | -- We can have text-boxes use tones as we talk by letting the library know short samples exist. 129 | -- If you don't have any samples added voice commands will not work. 130 | -- Audio Source, Volume 131 | Text.configure.add_text_sound(Audio.text.default, 0.2) 132 | Text.configure.add_text_sound(Audio.text.typing, 0.2) 133 | Text.configure.add_text_sound(Audio.text.cackle, 0.2) 134 | Text.configure.add_text_sound(Audio.text.neue, 0.2) 135 | 136 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 137 | -- Global example code that is used for scripting reasons, could be local as well, but it's a lazy way to allow [function=lua code] to access it. 138 | -- There are nicer ways to do this, but it works as an example. 139 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 140 | example = { 141 | display_mode = 11, 142 | maxmodes = 11, 143 | long_text_block = require('longtext'), 144 | ex5_textboxsize = 64, 145 | bop = true, 146 | boptimer = 1, 147 | } 148 | 149 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 150 | -- Setting up textboxes 151 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 152 | function love.load() 153 | -- Set up examples 154 | -- Example 1 // Default Font // Examples 155 | example1box = Text.new("left", { color = {1,1,1,1}, shadow_color = {0.5,0.5,1,0.4}, keep_space_on_line_break=true, default_underline_position = -2, default_strikethrough_position = 1}) 156 | example1box:send(example.long_text_block, 320*4, true) 157 | -- Example 2 // Golden Apple Font // Earthbound Style Box 158 | example2box = Text.new("left", { color = {1,1,1,1}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.golden_apple, keep_space_on_line_break=true, character_sound = true, adjust_line_height = -3}) 159 | example2box:send("• Do you like eggs?[newline]• I think they are [pad=6]eggzelent![audio=sfx=laugh]", 100, false) 160 | -- Example 3 // Golden Apple Font // Mother 3 Style Bottom 161 | example3box = Text.new("left", { color = {1,1,1,1}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.golden_apple, keep_space_on_line_break=true, character_sound = false, print_speed = 0.02, adjust_line_height = -3}) 162 | example3box:send("I am a very cute [color=#00ff00]green frog[/color]. Would you like to eat dinner with me? It's [rainbow][bounce]fresh[/bounce] [u]fly[/u] [shake]soup[/shake]![/rainbow]", 316, false) 163 | --Example 4 // Earth Illusion // Bubble Style Box 164 | example4box = Text.new("left", { color = {0,0,0,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.earth_illusion, keep_space_on_line_break=true, adjust_line_height = -2}) 165 | example4box:send("[dropshadow=2][b]Old Man:[/b][newline]Hello young man. How are you?", 74, true) 166 | --Example 5 // Earth Illusion // Final Fantasy Style 167 | example5box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.earth_illusion, keep_space_on_line_break=true, character_sound = true, sound_every = 5, sound_number = 2, adjust_line_height = -2}) 168 | example5box:send("[dropshadow=3][function=example.ex5_textboxsize=64][textspeed=0.02]With the Power of Queens, they challenged the Snakes. Garry's mighty waves peeled apart their diamond scales. The Wízärds woke[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]mighty windstorms. Niza brought the deadly wine[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]and cheese. [audio=sfx=ui]", 320-16, false) 169 | --Example 6 // Comic Neue / Center Box 170 | example6box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.comic_neue, keep_space_on_line_break=true, character_sound = true, sound_every = 5, sound_number = 2}) 171 | example6box:send("Oh wow, you found the [bounce][rainbow]high-res[/rainbow][/bounce] text! [icon=1][icon=2][icon=3][icon=4] [icon=5][icon=6][icon=7][icon=8] [icon=9][icon=10][icon=11][icon=12][/]", 320*4-16, true) 172 | --Example 7 // Comic Neue Big / BoxBK Style 173 | example7box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.comic_neue_big, keep_space_on_line_break=true, character_sound = true, sound_every = 3, sound_number = 3}) 174 | example7box:send("[warble=-5][textspeed=0.02][image=witch][pad=32]There's something I have to say,[pause=0.7] [warble=5]this witch will save the day!", 320*4-16, false) 175 | --Example 8 // Comic Neue / Undertale Style 176 | example8box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.comic_neue_small, character_sound = true, print_speed = 0.04, sound_every = 2, sound_number = 4}) 177 | example8box:send("[function=example.bop=true]Did you hear about the [color=#FF0000]bad puns?[/color][pause=0.5] You did?![pause=0.5] That's [color=#FFFF00]great[/color][pause=0.8]! [shake]Now I don't have to tell you about them![/shake][pause=1][function=example.bop=false][audio=sfx=laugh]", 320-80, false) 178 | --Example 9 // Comic Neue / Pocket Monsters Scroll Style 179 | example9box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.comic_neue_small, character_sound = true, print_speed = 0.04, sound_every = 2, sound_number = 4}) 180 | example9box:send("Hello! Welcome to the world of Pocket Creatures![waitforinput][scroll][newline]My name is Professor Tree![newline][waitforinput][scroll][scroll]And you are?", 150, false) 181 | example10box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.monogram_extended_custom, character_sound = false, keep_space_on_line_break=true, modify_character_width_table = {["j"] = -1, }}) 182 | local sp_test_string = "[shake][[]color=red]Wow it's characters[[]/color][/shake]" 183 | example10box:send("Special Sheep Polution Test, Bahhh:\n\nij ij ij ij ij ij ij ij ij ij ij ij ij ij ij [color=#ff0000]ij ij ij ij ij[/color] ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ijfart [rainbow]\n\na a a a a a a[/rainbow] a a a a a a a a a a a a a a a a a a [function=print('tes1t')]\n[function=print('te2st')] \nI've dropped so many letters oh no!\nOjan Pjan Ajan Testj Characterj oj mh wj ikj applej orangej colaj Martijn..\n" .. sp_test_string, 540, true) 184 | example11box = Text.new("left", { color = {0.9,0.9,0.9,0.95}, shadow_color = {0.5,0.5,1,0.4}, font = Fonts.monogram_extended_custom, character_sound = false, keep_space_on_line_break=true, modify_character_width_table = {["j"] = -1, }}) 185 | example11box:send("Special Sheep Polution Test, Bahhh:\n\nij ij ij ij ij ij ij ij[function=print('test1')] ij ij ij ij ij ij ij [color=#ff0000]ij ij ij ij ij[/color] ij ij ij [function=print('test2')]ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ij ijfart[backspace=4] [rainbow]\n\na a a a a a a[/rainbow] a a a a a a a a a a a a a a a a a a [function=print('tes1t')]\n [function=print('te2st')] \nThis is for Function is executed twice when placed exactly after where the text is wrapped #10 " , 540, false) 186 | 187 | end 188 | 189 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 190 | -- Drawing depending on example 191 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 192 | function love.draw() 193 | local example_text = "" -- I'm doing it this way to keep the name with the examples, you would not normally do this. 194 | -- Generic Example covering the tags 195 | if example.display_mode == 1 then 196 | example_text = "Commands using the standard font in Love2D" 197 | example1box:draw(0,0) 198 | end 199 | 200 | if example.display_mode == 2 then 201 | Screen.start() 202 | example_text = "Earthbound Style Textbox - R to Reset View" 203 | love.graphics.draw(images.bg) 204 | Frame.draw("eb", 200 - 16, 20, 120, 58) 205 | example2box:draw(210 - 16, 22) 206 | Screen.stop() 207 | end 208 | 209 | if example.display_mode == 3 then 210 | Screen.start() 211 | example_text = "Mother3 Style Textbox - R to Reset View" 212 | love.graphics.draw(images.bg) 213 | Frame.draw("cart", 0, 140-13, 80, 14) 214 | love.graphics.setFont(Fonts.golden_apple) 215 | love.graphics.print("Some Dude", 4, 140-17) 216 | love.graphics.setFont(Fonts.default) 217 | Frame.draw("m3", 0, 140, 320, 40) 218 | example3box:draw(2, 138) 219 | Screen.stop() 220 | end 221 | 222 | if example.display_mode == 4 then 223 | Screen.start() 224 | example_text = "Speechbox Style Textbox" 225 | love.graphics.draw(images.bg) 226 | Frame.draw("bubble", 110, 36, 80, 80) 227 | example4box:draw(115, 36) 228 | Screen.stop() 229 | end 230 | 231 | if example.display_mode == 5 then 232 | Screen.start() 233 | example_text = "Final Enixy Style Textbox - R to Reset View - C to continue when prompted" 234 | love.graphics.draw(images.bg) 235 | Frame.draw("ff", 0, 0, 320, example.ex5_textboxsize) 236 | example5box:draw(8, 0) 237 | if example5box:is_finished() then 238 | love.graphics.setColor(1,0,0,1) 239 | love.graphics.rectangle("fill", 320/2-4, example.ex5_textboxsize - 5, 9, 10) 240 | love.graphics.setColor(1,1,1,1) 241 | local previousfont = love.graphics.getFont() 242 | love.graphics.setFont(Fonts.golden_apple) 243 | love.graphics.print("C", 320/2-4 + 2, example.ex5_textboxsize - 11) 244 | love.graphics.setFont(previousfont) 245 | end 246 | Screen.stop() 247 | end 248 | 249 | if example.display_mode == 6 then 250 | Screen.start() 251 | example_text = "Center Style Textbox" 252 | love.graphics.draw(images.bg) 253 | Screen.stop() 254 | Frame.draw("blk", 0, 180*4/2-20*4/2, 320*4, 20*4) 255 | example6box:draw(10,180*4/2 - 5*4 /2) 256 | end 257 | 258 | if example.display_mode == 7 then 259 | Screen.start() 260 | example_text = "Banjo Kazooee Style Textbox - R to reset" 261 | love.graphics.draw(images.bg) 262 | Screen.stop() 263 | Frame.draw("bk", 0, 180*4/1.1-20*4/2, 320*4, 20*4) 264 | example7box:draw(60,180*4/1.11 - 5*4 /2) 265 | end 266 | 267 | if example.display_mode == 8 then 268 | Screen.start() 269 | example_text = "Undertale Style Textbox" 270 | love.graphics.draw(images.bg) 271 | 272 | Frame.draw("utp", 10, 10, 300, 48) 273 | local bop = 1 274 | if example.bop then 275 | bop = 0.8 + (0.2 * math.abs(math.sin(example.boptimer))) 276 | end 277 | love.graphics.draw(images.neue, 14, 15, 0, 1, bop) 278 | example8box:draw(14 + 40, 15 ) 279 | 280 | Screen.stop() 281 | end 282 | 283 | if example.display_mode == 9 then 284 | Screen.start() 285 | example_text = "Catching Monsters Style Textbox / C to continue text" 286 | love.graphics.draw(images.bg) 287 | 288 | Frame.draw("utp", 320/2 - 150/2 - 4, 180 - 40, example9box.get.width + 8, 2 * 17) 289 | 290 | love.graphics.setScissor( 320/2 - 150/2, 180 - 40 + 4, example9box.get.width, 2 * 17 ) 291 | example9box:draw(320/2 - 150/2, 180 - 40 + 4) 292 | love.graphics.setScissor() 293 | 294 | if example9box:is_finished() and math.floor(love.timer.getTime()*10) % 2 == 0 then 295 | love.graphics.setColor(1,0,0,1) 296 | love.graphics.print("-", 320/2 - 150/2 + example9box.get.width - 8, 180 - 20 ) 297 | love.graphics.print("-", 320/2 - 150/2 + example9box.get.width - 8, 180 - 19 ) 298 | love.graphics.print("-", 320/2 - 150/2 + example9box.get.width - 8, 180 - 18 ) 299 | love.graphics.setColor(1,1,1,1) 300 | end 301 | 302 | Screen.stop() 303 | end 304 | 305 | if example.display_mode == 10 then 306 | Screen.start() 307 | example_text = "BugFix Textbox" 308 | 309 | love.graphics.draw(images.bg) 310 | Screen.stop() 311 | love.graphics.setColor(0,0,0,1) 312 | love.graphics.rectangle("fill",0,0,540, 540) 313 | love.graphics.setColor(1,1,1,1) 314 | example10box:draw(0,0) 315 | end 316 | 317 | 318 | 319 | if example.display_mode == 11 then 320 | Screen.start() 321 | example_text = "BugFix2 Textbox" 322 | 323 | love.graphics.draw(images.bg) 324 | Screen.stop() 325 | love.graphics.setColor(0,0,0,1) 326 | love.graphics.rectangle("fill",0,0,540, 540) 327 | love.graphics.setColor(1,1,1,1) 328 | example11box:draw(0,0) 329 | end 330 | 331 | -- Draw Information Bar At the Bottom 332 | love.graphics.setColor(0.95,0.95,0.95,1) 333 | love.graphics.rectangle("fill", 0, 180*4 - 25, 320*4, 40) 334 | love.graphics.setColor(0.2,0.2,0.2,1) 335 | love.graphics.setFont(Fonts.default) 336 | love.graphics.print("[Space for Next Example] - " .. example_text, 2, 180*4 - 40 + 2 + 18) 337 | --love.graphics.print("X: " .. Screen.mouse.x .. " Y: " .. Screen.mouse.y .. " FPS: " .. love.timer.getFPS(), 2, 180*4 - 40 ) 338 | love.graphics.setColor(1,1,1,1) 339 | end 340 | 341 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 342 | -- Updating depending on example 343 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 344 | function love.update(dt) 345 | Screen.update(dt) 346 | if example.display_mode == 1 then 347 | example1box:update(dt) 348 | end 349 | if example.display_mode == 2 then 350 | example2box:update(dt) 351 | end 352 | if example.display_mode == 3 then 353 | example3box:update(dt) 354 | end 355 | if example.display_mode == 4 then 356 | example4box:update(dt) 357 | end 358 | if example.display_mode == 5 then 359 | example5box:update(dt) 360 | end 361 | if example.display_mode == 6 then 362 | example6box:update(dt) 363 | end 364 | if example.display_mode == 7 then 365 | example7box:update(dt) 366 | end 367 | if example.display_mode == 8 then 368 | example8box:update(dt) 369 | example.boptimer = example.boptimer + dt * 10 370 | end 371 | if example.display_mode == 9 then 372 | example9box:update(dt) 373 | end 374 | if example.display_mode == 10 then 375 | example10box:update(dt) 376 | end 377 | if example.display_mode == 11 then 378 | example11box:update(dt) 379 | end 380 | end 381 | 382 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 383 | -- Hacky mess per example 384 | --[[-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]-- 385 | function love.keypressed( key, scancode, isrepeat ) 386 | if key == "f3" then print(table.concat(example11box.table_string)) end 387 | if key == "f2" then print(table.concat(example11box.table_string, "|")) end 388 | if key == "space" then example.display_mode = example.display_mode + 1 end 389 | if example.display_mode > example.maxmodes then example.display_mode = 1 end 390 | if example.display_mode == 1 then 391 | example1box:send(example.long_text_block, 320*4, true) 392 | if key == "r" then 393 | end 394 | end 395 | if example.display_mode == 2 then 396 | if key == "r" then 397 | example2box:send("[|•] Do you like eggs?[newline][|•] I think they are [pad=6]eggzelent!", 100, false) 398 | end 399 | 400 | end 401 | if example.display_mode == 9 then 402 | if key == "r" then 403 | example9box:send("Hello! Welcome to the world of Pocket Creatures![waitforinput][scroll][newline]My name is Professor Tree![newline][waitforinput][scroll][scroll]And you are?", 150, false) 404 | end 405 | if key == "c" then 406 | example9box:continue() 407 | end 408 | end 409 | if example.display_mode == 3 then 410 | if key == "r" then 411 | example3box:send("I am a very cute [color=#00ff00]green frog[/color]. Would you like to eat dinner with me? It's [rainbow][bounce]fresh[/bounce] [u]fly[/u] [shake]soup[/shake]![/rainbow]", 316, false) 412 | end 413 | end 414 | if example.display_mode == 7 then 415 | if key == "r" then 416 | example7box:send("[warble=-5][textspeed=0.02][image=witch][pad=32]There's something I have to say,[pause=0.7] [warble=5]this witch will save the day!", 320*4-16, false) 417 | 418 | end 419 | end 420 | if example.display_mode == 8 then 421 | if key == "r" then 422 | example8box:send("[function=example.bop=true]Did you hear about the [color=#FF0000]bad puns?[/color][pause=0.5] You did?![pause=0.5] That's [color=#FFFF00]great[/color]![pause=0.8] [shake]Now I don't have to tell you about them![/shake][pause=1][function=example.bop=false][audio=sfx=laugh]", 320-80, false) 423 | 424 | end 425 | end 426 | if example.display_mode == 5 then 427 | if key == "r" then 428 | example5box:send("[dropshadow=3][function=example.ex5_textboxsize=64][textspeed=0.02]With the Power of Queens, they challenged the Snakes. Garry's mighty waves peeled apart their diamond scales. The Wizards woke[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]mighty windstorms. Niza brought the deadly wine[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]and cheese. [audio=sfx=ui]", 320-16, false) 429 | end 430 | if key == "c" then 431 | example5box:continue() 432 | if example.ex5_textboxsize > 64+15+15 and example5box:is_finished() then 433 | example5box:send("[dropshadow=3][function=example.ex5_textboxsize=64][textspeed=0.02]With the Power of Queens, they challenged the Snakes. Garry's mighty waves peeled apart their diamond scales. The Wizards woke[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]mighty windstorms. Niza brought the deadly wine[waitforinput][audio=sfx=ui] [function=example.ex5_textboxsize=example.ex5_textboxsize+16]and cheese. [audio=sfx=ui]", 320-16, false) 434 | end 435 | end 436 | end 437 | end -------------------------------------------------------------------------------- /example/font/golden_apple.fnt: -------------------------------------------------------------------------------- 1 | info face="Golden Apple" size=18 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=0 padding=2,2,2,2 spacing=2,1 outline=0 2 | common lineHeight=18 base=15 scaleW=512 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 3 | page id=0 file="golden_apple_0.png" 4 | chars count=388 5 | char id=-1 x=471 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 6 | char id=32 x=104 y=69 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 7 | char id=33 x=111 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 8 | char id=34 x=109 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 9 | char id=35 x=140 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 10 | char id=36 x=152 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 11 | char id=37 x=26 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 12 | char id=38 x=70 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 13 | char id=39 x=127 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 14 | char id=40 x=129 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 15 | char id=41 x=139 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 16 | char id=42 x=149 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 17 | char id=43 x=212 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 18 | char id=44 x=95 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 19 | char id=45 x=236 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 20 | char id=46 x=87 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 21 | char id=47 x=388 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 22 | char id=48 x=399 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 23 | char id=49 x=179 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 24 | char id=50 x=421 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 25 | char id=51 x=432 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 26 | char id=52 x=320 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 27 | char id=53 x=443 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 28 | char id=54 x=454 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 29 | char id=55 x=356 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 30 | char id=56 x=465 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 31 | char id=57 x=476 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 32 | char id=58 x=71 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 33 | char id=59 x=465 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 34 | char id=60 x=416 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 35 | char id=61 x=428 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 36 | char id=62 x=440 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 37 | char id=63 x=0 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 38 | char id=64 x=91 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 39 | char id=65 x=464 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 40 | char id=66 x=476 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 41 | char id=67 x=488 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 42 | char id=68 x=500 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 43 | char id=69 x=11 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 44 | char id=70 x=22 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 45 | char id=71 x=24 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 46 | char id=72 x=36 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 47 | char id=73 x=199 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 48 | char id=74 x=44 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 49 | char id=75 x=72 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 50 | char id=76 x=55 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 51 | char id=77 x=322 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 52 | char id=78 x=336 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 53 | char id=79 x=96 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 54 | char id=80 x=132 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 55 | char id=81 x=108 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 56 | char id=82 x=120 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 57 | char id=83 x=132 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 58 | char id=84 x=144 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 59 | char id=85 x=156 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 60 | char id=86 x=168 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 61 | char id=87 x=392 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 62 | char id=88 x=180 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 63 | char id=89 x=192 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 64 | char id=90 x=66 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 65 | char id=91 x=209 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 66 | char id=92 x=88 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 67 | char id=93 x=419 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 68 | char id=94 x=240 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 69 | char id=95 x=252 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 70 | char id=96 x=409 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 71 | char id=97 x=451 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 72 | char id=98 x=385 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 73 | char id=99 x=363 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 74 | char id=100 x=352 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 75 | char id=101 x=341 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 76 | char id=102 x=289 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 77 | char id=103 x=319 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 78 | char id=104 x=308 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 79 | char id=105 x=119 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 80 | char id=106 x=505 y=23 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 81 | char id=107 x=242 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 82 | char id=108 x=504 y=92 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 83 | char id=109 x=28 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 84 | char id=110 x=220 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 85 | char id=111 x=209 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 86 | char id=112 x=198 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 87 | char id=113 x=187 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 88 | char id=114 x=239 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 89 | char id=115 x=143 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 90 | char id=116 x=229 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 91 | char id=117 x=110 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 92 | char id=118 x=264 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 93 | char id=119 x=168 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 94 | char id=120 x=44 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 95 | char id=121 x=11 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 96 | char id=122 x=484 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 97 | char id=123 x=473 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 98 | char id=124 x=63 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 99 | char id=125 x=462 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 100 | char id=126 x=445 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 101 | char id=161 x=143 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 102 | char id=162 x=276 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 103 | char id=163 x=288 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 104 | char id=164 x=497 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 105 | char id=165 x=300 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 106 | char id=166 x=103 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 107 | char id=167 x=312 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 108 | char id=168 x=440 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 109 | char id=169 x=364 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 110 | char id=170 x=429 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 111 | char id=171 x=78 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 112 | char id=172 x=324 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 113 | char id=173 x=418 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 114 | char id=174 x=0 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 115 | char id=175 x=336 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 116 | char id=176 x=249 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 117 | char id=177 x=348 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 118 | char id=178 x=299 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 119 | char id=179 x=269 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 120 | char id=180 x=279 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 121 | char id=181 x=360 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 122 | char id=182 x=372 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 123 | char id=183 x=135 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 124 | char id=184 x=309 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 125 | char id=185 x=504 y=115 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 126 | char id=186 x=374 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 127 | char id=187 x=0 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 128 | char id=188 x=484 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 129 | char id=189 x=458 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 130 | char id=190 x=432 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 131 | char id=191 x=330 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 132 | char id=192 x=384 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 133 | char id=193 x=396 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 134 | char id=194 x=408 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 135 | char id=195 x=420 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 136 | char id=196 x=432 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 137 | char id=197 x=444 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 138 | char id=198 x=471 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 139 | char id=199 x=456 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 140 | char id=200 x=297 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 141 | char id=201 x=286 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 142 | char id=202 x=275 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 143 | char id=203 x=264 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 144 | char id=204 x=119 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 145 | char id=205 x=159 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 146 | char id=206 x=169 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 147 | char id=207 x=219 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 148 | char id=208 x=39 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 149 | char id=209 x=238 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 150 | char id=210 x=468 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 151 | char id=211 x=480 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 152 | char id=212 x=168 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 153 | char id=213 x=492 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 154 | char id=214 x=0 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 155 | char id=215 x=12 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 156 | char id=216 x=364 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 157 | char id=217 x=24 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 158 | char id=218 x=36 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 159 | char id=219 x=48 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 160 | char id=220 x=60 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 161 | char id=221 x=72 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 162 | char id=222 x=253 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 163 | char id=223 x=65 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 164 | char id=224 x=176 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 165 | char id=225 x=165 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 166 | char id=226 x=154 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 167 | char id=227 x=84 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 168 | char id=228 x=132 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 169 | char id=229 x=498 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 170 | char id=230 x=280 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 171 | char id=231 x=410 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 172 | char id=232 x=377 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 173 | char id=233 x=366 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 174 | char id=234 x=355 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 175 | char id=235 x=344 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 176 | char id=236 x=369 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 177 | char id=237 x=359 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 178 | char id=238 x=349 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 179 | char id=239 x=339 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 180 | char id=240 x=333 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 181 | char id=241 x=96 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 182 | char id=242 x=322 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 183 | char id=243 x=300 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 184 | char id=244 x=88 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 185 | char id=245 x=108 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 186 | char id=246 x=77 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 187 | char id=247 x=120 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 188 | char id=248 x=52 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 189 | char id=249 x=66 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 190 | char id=250 x=55 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 191 | char id=251 x=487 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 192 | char id=252 x=22 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 193 | char id=253 x=0 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 194 | char id=254 x=189 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 195 | char id=255 x=396 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 196 | char id=305 x=79 y=207 width=6 height=22 xoffset=-2 yoffset=-2 xadvance=2 page=0 chnl=15 197 | char id=338 x=172 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 198 | char id=339 x=224 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 199 | char id=710 x=379 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 200 | char id=730 x=99 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 201 | char id=732 x=419 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 202 | char id=8211 x=231 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 203 | char id=8212 x=420 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 204 | char id=8216 x=492 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 205 | char id=8217 x=54 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 206 | char id=8218 x=503 y=0 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 207 | char id=8220 x=33 y=184 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 208 | char id=8221 x=33 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 209 | char id=8222 x=77 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 210 | char id=8224 x=144 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 211 | char id=8225 x=156 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 212 | char id=8226 x=501 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 213 | char id=8230 x=168 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 214 | char id=8249 x=99 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 215 | char id=8250 x=259 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 216 | char id=8252 x=180 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 217 | char id=8253 x=192 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 218 | char id=8260 x=142 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 219 | char id=8308 x=407 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 220 | char id=8364 x=448 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 221 | char id=8482 x=487 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 222 | char id=8592 x=204 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 223 | char id=8593 x=127 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 224 | char id=8594 x=216 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 225 | char id=8595 x=112 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 226 | char id=8598 x=350 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 227 | char id=8599 x=336 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 228 | char id=8600 x=252 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 229 | char id=8601 x=210 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 230 | char id=8722 x=406 y=46 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 231 | char id=8725 x=311 y=138 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 232 | char id=8853 x=196 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 233 | char id=9728 x=0 y=0 width=20 height=22 xoffset=-2 yoffset=-2 xadvance=16 page=0 chnl=15 234 | char id=9729 x=214 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 235 | char id=9730 x=455 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 236 | char id=9731 x=140 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 237 | char id=9732 x=56 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 238 | char id=9737 x=14 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 239 | char id=9749 x=96 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 240 | char id=9785 x=287 y=0 width=16 height=22 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 241 | char id=9786 x=269 y=0 width=16 height=22 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 242 | char id=9788 x=429 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 243 | char id=9789 x=294 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 244 | char id=9790 x=154 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 245 | char id=9791 x=228 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 246 | char id=9792 x=240 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 247 | char id=9793 x=252 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 248 | char id=9794 x=308 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 249 | char id=9795 x=434 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 250 | char id=9796 x=13 y=69 width=11 height=22 xoffset=-2 yoffset=-2 xadvance=7 page=0 chnl=15 251 | char id=9797 x=406 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 252 | char id=9798 x=439 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 253 | char id=9799 x=264 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 254 | char id=9800 x=251 y=0 width=16 height=22 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 255 | char id=9801 x=233 y=0 width=16 height=22 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 256 | char id=9802 x=340 y=0 width=15 height=22 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 257 | char id=9803 x=323 y=0 width=15 height=22 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 258 | char id=9804 x=391 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 259 | char id=9805 x=81 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 260 | char id=9806 x=16 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 261 | char id=9807 x=42 y=0 width=18 height=22 xoffset=-2 yoffset=-2 xadvance=14 page=0 chnl=15 262 | char id=9808 x=0 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 263 | char id=9809 x=32 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 264 | char id=9810 x=22 y=0 width=18 height=22 xoffset=-2 yoffset=-2 xadvance=14 page=0 chnl=15 265 | char id=9811 x=202 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 266 | char id=9812 x=378 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 267 | char id=9813 x=182 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 268 | char id=9814 x=112 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 269 | char id=9815 x=98 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 270 | char id=9816 x=84 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 271 | char id=9817 x=42 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 272 | char id=9818 x=490 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 273 | char id=9819 x=378 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 274 | char id=9820 x=350 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 275 | char id=9821 x=322 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 276 | char id=9822 x=266 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 277 | char id=9823 x=392 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 278 | char id=9824 x=277 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 279 | char id=9825 x=262 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 280 | char id=9826 x=276 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 281 | char id=9827 x=374 y=0 width=15 height=22 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 282 | char id=9828 x=247 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 283 | char id=9829 x=307 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 284 | char id=9830 x=288 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 285 | char id=9831 x=100 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 286 | char id=9833 x=121 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 287 | char id=9834 x=126 y=46 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 288 | char id=9835 x=80 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 289 | char id=9836 x=64 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 290 | char id=9837 x=300 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 291 | char id=9838 x=312 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 292 | char id=9839 x=217 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 293 | char id=9856 x=119 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 294 | char id=9857 x=138 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 295 | char id=9858 x=157 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 296 | char id=9859 x=176 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 297 | char id=9860 x=195 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 298 | char id=9861 x=62 y=0 width=17 height=22 xoffset=-2 yoffset=-2 xadvance=13 page=0 chnl=15 299 | char id=9886 x=474 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 300 | char id=9887 x=483 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 301 | char id=9888 x=407 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 302 | char id=9889 x=324 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 303 | char id=9890 x=476 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 304 | char id=9891 x=48 y=23 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 305 | char id=9892 x=187 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 306 | char id=9893 x=462 y=23 width=12 height=22 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=15 307 | char id=9894 x=157 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 308 | char id=9895 x=357 y=0 width=15 height=22 xoffset=-2 yoffset=-2 xadvance=11 page=0 chnl=15 309 | char id=9896 x=336 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 310 | char id=9897 x=305 y=0 width=16 height=22 xoffset=-2 yoffset=-2 xadvance=12 page=0 chnl=15 311 | char id=9898 x=348 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 312 | char id=9899 x=360 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 313 | char id=9954 x=372 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 314 | char id=10241 x=0 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 315 | char id=10242 x=9 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 316 | char id=10243 x=18 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 317 | char id=10244 x=27 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 318 | char id=10245 x=36 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 319 | char id=10246 x=45 y=207 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 320 | char id=10247 x=438 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 321 | char id=10248 x=384 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 322 | char id=10249 x=396 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 323 | char id=10250 x=408 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 324 | char id=10251 x=420 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 325 | char id=10252 x=432 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 326 | char id=10253 x=444 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 327 | char id=10254 x=456 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 328 | char id=10255 x=468 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 329 | char id=10256 x=480 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 330 | char id=10257 x=492 y=115 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 331 | char id=10258 x=0 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 332 | char id=10259 x=12 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 333 | char id=10260 x=24 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 334 | char id=10261 x=36 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 335 | char id=10262 x=48 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 336 | char id=10263 x=60 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 337 | char id=10264 x=72 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 338 | char id=10265 x=84 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 339 | char id=10266 x=96 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 340 | char id=10267 x=108 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 341 | char id=10268 x=120 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 342 | char id=10269 x=132 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 343 | char id=10270 x=144 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 344 | char id=10271 x=156 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 345 | char id=10272 x=228 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 346 | char id=10273 x=180 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 347 | char id=10274 x=192 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 348 | char id=10275 x=204 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 349 | char id=10276 x=216 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 350 | char id=10277 x=228 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 351 | char id=10278 x=240 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 352 | char id=10279 x=252 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 353 | char id=10280 x=264 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 354 | char id=10281 x=276 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 355 | char id=10282 x=288 y=138 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 356 | char id=10283 x=116 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 357 | char id=10284 x=128 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 358 | char id=10285 x=164 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 359 | char id=10286 x=176 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 360 | char id=10287 x=188 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 361 | char id=10288 x=200 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 362 | char id=10289 x=224 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 363 | char id=10290 x=248 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 364 | char id=10291 x=260 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 365 | char id=10292 x=272 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 366 | char id=10293 x=284 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 367 | char id=10294 x=296 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 368 | char id=10295 x=308 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 369 | char id=10296 x=332 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 370 | char id=10297 x=344 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 371 | char id=10298 x=368 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 372 | char id=10299 x=380 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 373 | char id=10300 x=392 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 374 | char id=10301 x=404 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 375 | char id=10302 x=452 y=69 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 376 | char id=10303 x=0 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 377 | char id=10753 x=447 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 378 | char id=11088 x=292 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 379 | char id=11104 x=456 y=184 width=7 height=22 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=15 380 | char id=12300 x=319 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 381 | char id=12301 x=329 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 382 | char id=12302 x=12 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 383 | char id=12303 x=48 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 384 | char id=12304 x=60 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 385 | char id=12305 x=84 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 386 | char id=12317 x=204 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 387 | char id=12318 x=495 y=161 width=9 height=22 xoffset=-2 yoffset=-2 xadvance=5 page=0 chnl=15 388 | char id=12319 x=216 y=92 width=10 height=22 xoffset=-2 yoffset=-2 xadvance=6 page=0 chnl=15 389 | char id=65378 x=389 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 390 | char id=65379 x=399 y=184 width=8 height=22 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 391 | char id=65529 x=232 y=23 width=13 height=22 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 392 | char id=65533 x=423 y=0 width=14 height=22 xoffset=-2 yoffset=-2 xadvance=10 page=0 chnl=15 393 | --------------------------------------------------------------------------------