diff --git a/assets/sfx_door.raw b/assets/sfx_door.raw new file mode 100644 index 0000000..5e010e2 --- /dev/null +++ b/assets/sfx_door.raw @@ -0,0 +1 @@ +~~~~~~}}}}||{{{{zzzzyyxxxwwwwwwwvvvvvvvvvwwwwwwxxyyzz{{||}~€€‚‚ƒ„…†‡‡ˆ‰Š‹‹ŒŽŽ‘‘‘‘’’’’’’’’’’’’‘‘‘ŽŒ‹‹Š‰ˆ‡†…„ƒ‚€~|{zyxwvvutssrqqqppppoooooooooppppppqqqrrrssttuvvvwwxyyzz{||}}~€‚ƒƒ„…†‡‡ˆ‰Š‹ŒŽ‘‘’’“““’’’’‘ŽŒ‹Š‰ˆ†„ƒ‚€~|{zyxwvvutssrrqpponnmmllllkklllllmnopqstvwx{}€‚„…‡‰‹ŒŽŽŽ‘‘‘‘ŽŒ‹ŠŠ‹‹‹ŠŠ‰‰ˆˆˆˆ‡†„ƒƒ„„ƒ‚€~~~~}~€„‚‚†‰ƒ‡‡ˆ‹ˆ†ŠŠ‡ˆ‹Š‹‹Š‰‰ˆ†‡‰‰‡„‚„„†…‚~~}~~~~~}{zzzzzyxvuuwxvutrssrqrssrqrtvwwwwxx{||}}~}~€ƒƒ‚„„ƒ‚„…†††…€‚‚€‚ƒƒ‚€}|~€€~{xxyyzxxvsqrttvvuuxxxz|~~}zyxz~€‚ƒ‚ƒƒ€€ƒƒ‚€€€€|{zzzywvuuuvvuttssssrssssrstuwxxwwyz{}}}}}}|}}~€€‚………‡‡‡ˆˆ‰ŠŠ‰‡…„ƒ‚€}yusrqqpqqqrqrssstuvxy{{{{z{|{}~~}}{}~~€€‚„†ˆŠŒ“••—˜••“‘Ž‹‰Š‰ŠŠŠ‰‡‡‡††…„ƒ‚€‚ƒ„„„……„„„„ƒ‚€€€‚ƒƒ„†‡†††††‡‡ˆˆˆˆŠŠŠŠŠ‰ˆˆ†„‚€}{zyzzyyyxyy{{{{|}~€‚„„…†††‡‡ˆˆˆˆˆ‡…………††………†‡‡‡ˆˆˆ‰‰ˆ‰‰ˆ‡††„ƒ‚€~|{{{zzzzzz{|||}}~€‚ƒƒƒ‚‚‚‚€~~}}}{{{{z{|||||}~~~~~~~~}}}}}||{zyyyyyxxwvuuuuuuuuutttttssrqppooonmmmmnnopqrstuvwxyzzzzzzzyxxwwvvutssrrrrrrrsstuvvwxxyyyyyzzzzzzzzzzz{{|}~€€~~~}}}|}||}}}}~~€‚ƒ„…†‡ˆ‰ŠŠŠŠ‹‹ŠŠŠŠŠŠ‰‰‰‰ŠŠ‹ŒŒŒŒŒŒ‹ŒŒŠŠ‹‹Š‰‰ˆ…ƒƒƒ…††……„„…‡‡‡ˆ‰Š‹ŒŒŒ‹ŠŠŠ‰‰ˆ‡…ƒ‚€€€€~~}}}}}~}|}|||}|{{{|||}}~~€ƒƒ„…„ƒƒƒ‚€}|{||{{zzyyyzyyyzzyyzzzz{|||{{{zyyzwvvwyxxxwzz{|{{{{{{{zy{yyyyxwuuvuvvwwxyz{|~€€‚ƒƒƒ‚ƒ„„‚„ƒ„„„……„„……‡‡‡†‡†ˆˆ‡ˆ†‡Œ‡‡ŒŠ†„…†ˆˆˆ…ƒ…‰‰ˆ‹Š‰‡‡ˆ‰ŠŒ‹‰ŠŠŠˆ‹Œ‹‰‰‰‡…‡Š‡ˆˆ………†‡‰ˆˆ†„…†…‡‡‡…ƒ†‡‡‡‡‡†ˆ‡†…†…„„…„ƒ„„„„ƒ‚€€~}}~€‚ƒ‚‚~‚‚‚€€‚ƒ†ƒ„‚ƒ‚‚‚‚€~€{|y{|{z|{zz}|}~‚ƒƒƒƒ€‚€ƒ‚ƒƒ‚‚‚€€„„ƒƒ€€}~~}€~~€|}~€€~}|}}ƒƒƒ€€€}|yyzzz{|{||||~~€~{z|{{}||{||zzyzxwzwuxyz}~{yywwutpmppruwurkgljhjlkiljkqnowjltmnv„‰ˆˆ‡†‡ˆ‹Œ‹ŒŒ‡…ŒŒ’’––›œ £ ››šŸ¥¡š˜—–™ž¤§¥¥¢ž¡  Ÿ›—’‘’’—˜”˜ £§¨¨¤Ÿš™——•Œ‰‰•“Ž‹Š‡Ž’‘…ztkoxƒŠ‹…‚‚}|yusu|€€~||…Š‘•“’’”“Œ†€~z{{xtqoopprtwyyy{zyxxz~‚††„‚|y{ƒŠ‹‰Š‹‰ˆ„~€|ywsnhgkllnokhgjorstuvuttpoorvvvzystssqjfie`a^_\][VRSSOPRY]\[^cfggklmgb```^^\^abeedffeefggedfjooorqnljlrsvxy{}€~}||~€ƒ„„‚‚‚€€~}~€‚‚‚‚€€€~}}|||||{{||}~~~~~€€€€€‚‚ƒƒƒƒƒƒƒƒ„„ƒƒƒ‚‚ƒƒƒƒƒ‚‚‚‚‚ƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file diff --git a/assets/sfx_shot.raw b/assets/sfx_shot.raw new file mode 100644 index 0000000..b5d4b5f --- /dev/null +++ b/assets/sfx_shot.raw @@ -0,0 +1 @@ +€~~€…Š‘’”˜œ¢¥ž’ˆq`X[WVaknqzpg{uVT[O<4#9A3DRN]vw‹ª©³ÉÃ¥™†dcUGPHA`}vŒ‰xuz~’“¦Ñ°­¢‰›tZU#&,A-+,AH:+RbQcu}oiYŒTr” ¡”§³³¿¼¯­š—ˆ…qUBLWHG,!06+6L?3bf{“Œ³¹­¦”¡µ±©œ‰“’Š}~€f[^`T_jH[ZK^H[iZZTjlas}œ—ƒyŠxd\Unex‰u`\e}{|€{˜~‹€‡}…˜ƒ‹…i\qv{ˆ‡z|xhlkQPtw[]defhuu¢•™™Ž›¼¤«¡‡ž’‡…{hWWX_XYdeheeprsqjkn||v‡“”‰¢ž™š¡£™˜˜Œ‹œ•~vi]WV_VNRN^gXj‚€st|~›¡•ž•‘©´¹¾¬®¯¨º·¬ ‰–™vw|kdnpNZgi}nx„©›ž¦œ ¡¢•“’†sywpkewjo”†€ŠŠ“˜‘‡†zwwxvyv}’—Š„‹}}—Œ€‹€pt€{qvdVaddm|ƒŒ€s—’‘‡‰‘Š}uvuregdZlZYnafoimnfx‰ˆŒ†€†Œ‰‘ˆŒŽ‘‰yu{~€xx„z~snz}|ƒ„{|‚zz†„†…ˆ›žš–•‰—¡‘Œ™•Š‘”ŽŒŠƒrp~‰‰…ˆ…Š‘›™‰”£¤¢¥¥šž–“~~{yx~tpsmpvns€‡ˆ{…ypis€~{shgnwyollfn{rq}lmsfjcfq}ƒuzwpvu}|xzs{{x|umiigx„~‡…‚~z}y‚y}~~|~}xtouts|€ˆŽŽ•”‹†‚‚…‡Œ“’“““•”“•›š—Ÿž’Š‡Ž‹ƒ‚z{€tpsz…ˆ‡†„†ˆŽ“‘”•‘ˆyvrgkojhbgtpmrssrvu|‹‡ƒ†€xtlgpst{‚ˆ‡‰ˆ†‚„Œ‡„†††…}ysfeks}~}|}„ƒ†Œ…‡Œ‘‹‰‰…‚…‚|{}|€}yxzz{€€~‚ˆˆ…Š‰ƒ„†‡…ƒ~yxv}‚~}~‚‚‚‚„~xyƒzvxvx}{zzx{‡ŽŽ‰ˆ‘Ž‰ˆ‡…‡„€ƒŠŒ‰‚yx~…Œ‘ŠŒŠƒ‚~xz~~ƒŠ‰…„ƒ€{yuqqlluz‚~yyxw{~‚……‹‰‚{oikkrw{ƒzuw}‚…‰‹‰†‚€}wsvz€ƒ‚‚‚„„ˆŒŒŠˆ†…|zzyz}}|{|~‚~|x|~‚†ˆ‰ˆˆˆ„~~„ƒˆŠ„‚wsrqs}ƒˆŒŒ‹†‚~~~~}€~~~„…„†‡‡‡„€{vtsrrtrqqruwvx}„ˆˆˆ‹ŒŽˆ‚|xtsssvwwwvvx|€‚…Š‹‰‰‡~}€‚€€~{yz|ƒ‡‰‰‡„~~}}}}}{{}||}||||{}‚†…†‰‰‰ˆ‡ˆ‡…‚|xwz‚‚€|zzz~ƒ„…†…†‡†„‚†ˆ‰Š‰†…„ƒƒƒ~~|{{yxy{|}}ƒ„„„‚~~}|}}}€ƒ‚ƒƒƒƒ~~}{zyy{}~~~€‚„„…‡‡‡…„‚|{ywwxzzyy{}|}€€€€‚ƒƒƒƒƒ‚ƒ„ƒƒƒ~}|||zz{{{zzxvwxz}~€€€€‚„†‰‰‰‡†„‚‚‚‚‚€~}{ywvvwyzz{{|~€‚ƒƒ„„…††‡†…„‚‚‚‚‚‚€~}|{zyyz{|}~}|{||}}€‚„„……„ƒƒƒ‚‚‚€~~}}|}~~~€‚‚‚€€€€€€€€€€€€~}}|||||}}~€€€‚ƒƒƒ‚ƒ„„„„ƒ‚€}||{zzyyyyz||}~€€‚ƒƒƒƒ„„„„ƒ‚ƒ„ƒ‚€~~~}||||}}}~~€‚ƒƒ„„„ƒƒƒ‚‚€~~~}}|||}~€€€~~~~~€€€€€‚‚‚‚‚‚€€€€~~}}||||||}~€€‚‚‚‚‚‚‚‚€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file diff --git a/assets.h b/images.h similarity index 99% rename from assets.h rename to images.h index 18cfb1e..07bf97b 100644 --- a/assets.h +++ b/images.h @@ -17,8 +17,8 @@ whatsoever. */ -#ifndef _SFG_RESOURCES_H -#define _SFG_RESOURCES_H +#ifndef _SFG_IMAGES_H +#define _SFG_IMAGES_H #define SFG_TEXTURE_SIZE 32 diff --git a/main.c b/main.c index aab7cf1..95279db 100755 --- a/main.c +++ b/main.c @@ -89,6 +89,13 @@ void SFG_sleepMs(uint16_t timeMs); */ static inline void SFG_setPixel(uint16_t x, uint16_t y, uint8_t colorIndex); +/** + Play given sound effect (SFX). This function can use sound samples from + sounds.h or use different sounds (e.g. beeps of the specific platform), or + even do nothing (meaning there will be no sound effects playing). +*/ +void SFG_playSound(uint8_t soundIndex, uint8_t volume); + /* ========================================================================= */ /** @@ -115,7 +122,7 @@ void SFG_init(); #include "raycastlib.h" -#include "assets.h" +#include "images.h" #include "levels.h" #include "palette.h" #include "settings.h" // will include if not included by platform @@ -1780,7 +1787,7 @@ void SFG_gameStep() (SFG_gameFrame - SFG_player.weaponCooldownStartFrame > SFG_GET_WEAPON_FIRE_COOLDOWN_FRAMES(SFG_player.weapon))) { - // player: attack, shoot + // player: attack, shoot, fire uint8_t ammo, projectileCount, canShoot; @@ -1788,6 +1795,8 @@ void SFG_gameStep() if (canShoot) { + SFG_playSound(0,255); + if (ammo != SFG_AMMO_NONE) SFG_player.ammo[ammo] -= projectileCount; @@ -2370,14 +2379,19 @@ void SFG_gameStep() SFG_DoorRecord *door = &(SFG_currentLevel.doorRecords[SFG_currentLevel.checkedDoorIndex]); - door->state = (door->state & ~SFG_DOOR_UP_DOWN_MASK) | - ( - ((door->coords[0] >= (SFG_player.squarePosition[0] - 1)) && - (door->coords[0] <= (SFG_player.squarePosition[0] + 1)) && - (door->coords[1] >= (SFG_player.squarePosition[1] - 1)) && - (door->coords[1] <= (SFG_player.squarePosition[1] + 1))) ? - SFG_DOOR_UP_DOWN_MASK : 0x00 - ); + uint8_t upDownState = door->state & SFG_DOOR_UP_DOWN_MASK; + + uint8_t newUpDownState = + ((door->coords[0] >= (SFG_player.squarePosition[0] - 1)) && + (door->coords[0] <= (SFG_player.squarePosition[0] + 1)) && + (door->coords[1] >= (SFG_player.squarePosition[1] - 1)) && + (door->coords[1] <= (SFG_player.squarePosition[1] + 1))) ? + SFG_DOOR_UP_DOWN_MASK : 0x00; + + if (upDownState != newUpDownState) + SFG_playSound(1,255); + + door->state = (door->state & ~SFG_DOOR_UP_DOWN_MASK) | newUpDownState; SFG_currentLevel.checkedDoorIndex++; diff --git a/platform_sdl.h b/platform_sdl.h index 6dab2d2..9d75706 100644 --- a/platform_sdl.h +++ b/platform_sdl.h @@ -27,6 +27,8 @@ #include "palette.h" +#include "sounds.h" + #undef SFG_LOG #define SFG_LOG(str) printf("game: %s\n",str); @@ -170,6 +172,34 @@ typedef void (*em_callback_func)(void); void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop); #endif +uint8_t audioBuff[SFG_SFX_SAMPLE_COUNT]; +uint32_t audioPos = 0; + +void audioFillCallback(void *userdata, uint8_t *s, int l) +{ + if (audioPos >= SFG_SFX_SAMPLE_COUNT) + SDL_PauseAudio(1); + + for (int i = 0; i < l; ++i) + if (audioPos < SFG_SFX_SAMPLE_COUNT) + { + s[i] = audioBuff[audioPos]; + audioPos++; + } + else + s[i] = 127; +} + +void SFG_playSound(uint8_t soundIndex, uint8_t volume) +{ + for (int i = 0; i < SFG_SFX_SAMPLE_COUNT; ++i) + audioBuff[i] = SFG_GET_SFX_SAMPLE(soundIndex,i) * 16; + + audioPos = 0; + + SDL_PauseAudio(0); +} + int main(int argc, char *argv[]) { uint8_t argHelp = 0; @@ -233,7 +263,18 @@ int main(int argc, char *argv[]) SDL_ShowCursor(0); - SFG_init(); + SFG_init(SDL_INIT_AUDIO); + + SDL_AudioSpec audioSpec; + + audioSpec.callback = audioFillCallback; + audioSpec.userdata = 0; + audioSpec.freq = 8000; + audioSpec.format = AUDIO_U8; + audioSpec.channels = 1; + + if (SDL_OpenAudio(&audioSpec, NULL) < 0) + printf("SDL: could not initialize audio\n"); running = 1; @@ -249,6 +290,7 @@ int main(int argc, char *argv[]) SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); + SDL_CloseAudio(); printf("SDL: ending\n"); diff --git a/sounds.h b/sounds.h new file mode 100644 index 0000000..08f0660 --- /dev/null +++ b/sounds.h @@ -0,0 +1,142 @@ +/** + @file assets.h + + This file containts sounds and music that can optionally be used by the game + front end. Every sound effect has 2048 samples, is stored in 8kHz mono format + with 4 bit quantization, meaning every sound effect takes 1024 bytes. Sounds + can be converted using a provided python script like this: + + python snd2array.py sound.raw + + by Miloslav Ciz (drummyfish), 2019 + + Released under CC0 1.0 (https://creativecommons.org/publicdomain/zero/1.0/) + plus a waiver of all other intellectual property. The goal of this work is + be and remain completely in the public domain forever, available for any use + whatsoever. +*/ + +#ifndef _SFG_SOUNDS_H +#define _SFG_SOUNDS_H + +#define SFG_SFX_SAMPLE_COUNT 2048 +#define SFG_SFX_SIZE (SFG_SFX_SAMPLE_COUNT / 2) + +#define SFG_GET_SFX_SAMPLE(soundIndex,sampleIndex) \ + ((sampleIndex % 2) ? \ + (SFG_sounds[soundIndex][sampleIndex / 2] >> 4) : \ + (SFG_sounds[soundIndex][sampleIndex / 2] & 0x0f)) + +SFG_PROGRAM_MEMORY uint8_t SFG_sounds[][SFG_SFX_SIZE] = +{ + { // 0, bullet shot +135,119,120,136,136,153,153,153,154,169,152,119,101,85,86,102,119,118,119, +85,84,51,33,52,52,84,87,120,170,188,202,152,102,84,84,70,119,136,119, +119,121,154,219,170,137,117,82,18,36,34,33,20,67,68,70,137,172,189,237, +220,150,120,120,97,36,102,121,151,87,169,118,86,102,120,137,135,120,186,155, +223,255,217,103,100,70,119,118,84,34,36,122,204,220,168,138,170,170,223,199, +117,70,119,136,100,85,102,51,37,101,103,118,101,136,87,154,169,171,187,186, +169,153,136,117,68,84,66,18,19,50,52,51,102,121,139,186,169,171,186,152, +153,136,119,134,85,101,86,69,84,84,86,85,86,102,119,120,153,135,135,101, +87,134,103,135,101,103,119,135,152,120,136,135,137,136,151,134,87,119,136,119, +118,102,85,119,85,102,102,119,138,137,153,137,186,170,137,152,135,101,85,85, +86,102,102,119,119,102,103,119,137,152,138,153,154,169,153,152,137,151,118,85, +85,84,84,86,86,136,119,119,154,153,153,171,187,170,170,187,170,137,151,119, +102,103,69,102,118,120,120,138,153,169,170,169,153,135,119,119,102,118,105,136, +136,137,152,153,136,152,119,119,119,119,121,152,136,119,152,136,135,120,119,118, +86,102,103,136,135,137,153,136,152,119,119,118,102,86,85,102,102,102,102,120, +136,136,136,136,152,136,153,152,119,119,120,135,120,119,119,103,119,136,119,135, +120,135,136,136,137,153,153,152,154,152,153,137,152,136,135,119,136,136,136,153, +152,154,170,170,153,153,152,119,119,119,119,118,119,103,136,136,120,135,118,120, +119,118,102,119,102,102,103,119,118,103,102,102,119,135,119,119,119,119,119,119, +119,118,102,103,135,136,135,119,120,135,119,119,119,119,103,119,120,136,137,152, +136,136,136,153,153,136,153,153,153,153,153,152,153,136,136,135,119,135,119,119, +136,136,136,136,152,152,137,153,152,119,118,102,102,102,119,103,119,119,119,136, +136,135,118,103,119,120,136,136,136,136,136,136,136,119,118,102,119,119,119,136, +136,136,136,137,136,136,136,136,119,119,120,135,119,119,120,135,136,136,136,136, +136,136,119,119,120,119,120,136,136,135,119,120,119,119,119,119,119,120,136,152, +136,137,153,136,136,136,136,136,136,136,119,120,137,153,136,136,135,119,119,136, +136,136,135,119,119,102,119,120,135,119,119,119,136,136,136,118,102,103,119,136, +119,119,120,136,136,136,135,119,119,136,136,136,136,136,136,136,136,135,119,119, +119,119,119,136,119,119,119,136,136,136,136,135,120,136,136,136,119,119,119,120, +136,136,136,136,135,119,119,119,119,136,119,119,136,136,136,136,135,119,119,119, +119,119,119,119,119,136,136,136,136,136,135,119,119,119,119,119,119,119,136,136, +136,136,135,120,136,136,136,119,119,119,136,136,136,135,119,119,119,119,119,119, +119,119,119,119,136,136,120,136,136,136,136,136,119,119,120,136,136,136,119,119, +120,136,136,136,136,136,136,136,136,136,136,136,135,119,119,119,119,119,119,119, +120,136,136,136,135,119,119,119,119,136,136,136,136,136,135,119,119,119,119,119, +119,120,136,136,136,136,136,135,119,119,119,119,119,119,119,120,136,136,136,136, +136,136,136,136,136,136,119,119,119,119,119,119,119,119,119,119,136,136,136,136, +136,136,136,136,136,136,136,119,119,119,119,119,119,119,119,136,136,136,136,136, +136,136,136,136,136,136,136,119,119,119,119,119,119,119,119,119,119,136,136,136, +136,136,136,136,119,119,119,119,119,120,136,136,136,136,136,136,136,135,119,119, +136,136,119,119,119,119,119,119,120,135,120,136,136,136,136,136,136,136,136,135, +119,119,119,119,119,119,119,119,136,136,136,136,136,136,136,136,136,135,119,119, +119,119,119,119,119,119,119,119,119,119,136,136,136,136,136,136,136,136,119,119, +119,119,119,119,119,120,136,136,136,136,136,136,136,119,119,119,119,119,119,119, +119,119,119,136,135,119,120,119,119,120,136,136,136,136,136,136,119,119,119,119, +119,119,119,119,120,136,136,136,136,136,136,136,119,119,135,119,119,119,119,119, +119,119,119,119,135,120,136,136,136,136,136,135,119,119,119,119,119,120,119,119, +119,135,119,136,136,136,136,136,136,135,119,119,119,119,119,119,119,119,136,136, +136,136,136,136,136,136,135,119,136,136,135,119,119,119,119,119,119,119,119,119, +119,119,136,136,136,136,136,136,136,136,136,119,119,119,119,119,119,119,136,136, +136,136,136,136,136,136,135,119,119,135,135,120,120,120,120,120,120,120,120,135, +135,136,120,120,135 + }, + { // 1, door opening +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,136, +136,136,136,136,136,136,136,136,136,136,153,153,153,153,153,153,153,153,153,153, +153,153,152,136,136,136,136,136,136,136,136,136,119,119,119,119,119,119,119,119, +119,119,119,102,102,102,102,103,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,136,136,136,136,136,136,136,136,136,136,153,153,153,153,153, +153,153,136,136,136,136,136,136,135,119,119,119,119,119,119,119,119,119,102,102, +102,102,102,102,102,102,102,103,119,119,119,119,120,136,136,136,136,136,137,153, +153,153,153,153,152,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +135,119,119,119,119,120,136,136,136,136,136,136,136,137,136,136,136,136,136,136, +136,136,136,136,136,136,135,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,136,136,136,136,136,136,120, +136,136,136,136,136,136,136,135,120,136,136,135,119,120,135,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,120,136,136,136,136,136,119,120,136,136, +136,136,136,135,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,120,136,136,136,136,136,136,136,136,136,136,136, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +136,136,136,136,136,153,153,153,153,153,152,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,135,120,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,135,119,119,119,119,119,119,119,119,119,119,120,136, +136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,119,119,119,119,119,119,119,119,119,136,136,136,136,136,136,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,102,102,102,102,102,103,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,120,136,136,136,136,119,119,119,119,119,119,119,119, +119,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,135,119,119,119,119,119,119,119,119,119,119,119,119, +119,120,136,136,136,136,136,136,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,120,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,136,120,135,119,119,119,136,136,136,136, +136,136,135,136,136,136,136,136,136,136,135,136,136,136,136,120,119,135,119,119, +119,119,119,119,119,120,136,136,120,136,136,136,136,136,119,136,135,136,136,136, +136,136,136,136,119,119,120,135,119,135,119,136,135,119,120,120,136,136,136,136, +135,119,119,119,119,119,119,119,119,120,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,103,119,119,119,102,102,102,102,102,102,118,103, +102,118,103,136,136,136,136,136,136,136,136,136,137,153,153,153,170,169,153,153, +170,153,153,153,170,170,169,170,169,153,153,153,153,153,153,170,170,170,153,153, +153,136,137,153,136,136,137,152,119,102,120,136,136,135,119,119,119,120,135,119, +119,120,137,153,153,153,152,136,135,119,119,119,102,119,119,119,119,119,119,119, +120,136,136,119,120,137,152,137,136,136,136,136,119,120,135,119,118,102,102,102, +102,102,102,119,119,119,119,118,103,119,119,119,119,119,102,102,102,85,85,85, +85,84,85,85,85,86,102,102,102,102,102,101,85,86,102,102,102,102,102,102, +102,102,102,119,102,102,119,119,119,120,136,119,119,119,120,136,136,136,136,136, +136,135,119,119,136,136,136,136,136,136,119,120,135,119,119,119,119,119,119,119, +119,119,119,120,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, +136,136,136,120,120 + } +}; + +#endif // guard