Start sound

This commit is contained in:
Miloslav Číž 2020-02-04 17:17:00 +01:00
parent 3ddb89a8cb
commit 9509f650df
6 changed files with 213 additions and 13 deletions

1
assets/sfx_door.raw Normal file
View File

@ -0,0 +1 @@
~~~~~~}}}}||{{{{zzzzyyxxxwwwwwwwvvvvvvvvvwwwwwwxxyyzz{{||}~€€у<EFBD83>㊧炎給訣試緒瑞髄荘葬鋳鋳鋳鋳鋳酎荘瑞随庶麹結糾沿㊥<E6B2BF>モ÷~|{zyxwvvutssrqqqppppoooooooooppppppqqqrrrssttuvvvwwxyyzz{||}}~€<EFBD83><EFBFBD>葛訣誌署荘鋳涛湯鋳酎随詩結渇<E7B590>с<EFBFBD>~|{zyxwvvutssrrqpponnmmllllkklllllmnopqstvwx{}€<C280>焔月試署荘荘瑞瑞瑞錘麹麹麹結滑給糾渇沿<E6B887><E6B2BF><EFBFBD>ャтモ€~~~~}~€≧宴〟㊧笈<E38AA7>滑㊧糾給渇沿<E6B887>演℡ф<EFBD84>×~}~~~~~}{zzzzzyxvuuwxvutrssrqrssrqrtvwwwwxx{||}}~}~€メ≠тモ<D182><7F><EFBC9E><EFBFBD>€<EFBC9D>€€}|~€€~{xxyyzxxvsqrttvvuuxxxz|~~}zyxz~€a=モャ÷€=ャ≠÷€€€|{zzzywvuuuvvuttssssrssssrstuwxxwwyz{}}}}}}|}}~€÷<C3B7>㊦㊧<E38AA6>滑援<E6BB91>モ÷}yusrqqpqqqrqrssstuvxy{{{{z{|{}~~}}{}~~€€<C280>褐刻嵩封利封淘随詩級渇滑渇㊦㊥<E38AA6>с€ту<D182>тс€€€≠ャф㊥<D184><E38AA5><EFBFBD><E38AA6>滑滑渇<E6BB91><E6B887>€}{zyzzyyyxyy{{{{|}~€у<EFBD84><D183><EFBFBD><E38AA7><EFBFBD><E38AA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E38AA6>沿演<E6B2BF><E6BC94>с<EFBFBD>~|{{{zzzzzz{|||}}~€≠ャモb≠€~~}}}{{{{z{|||||}~~~~~~~~}}}}}||{zyyyyyxxwvuuuuuuuuutttttssrqppooonmmmmnnopqrstuvwxyzzzzzzzyxxwwvvutssrrrrrrrsstuvvwxxyyyyyzzzzzzzzzzz{{|}~€===÷~~~}}}|}||}}}}~~€≠ヤ<E289A0>㊧炎滑葛糾滑滑渇演炎葛血血血旧麹穴葛糾演<E7B3BE>ャュ<E383A3><E383A5>т<EFBFBD><EFBFBD>葛血結滑渇沿㊤モ÷€€÷~~}}}}}~}|}|||}|{{{|||}}~~€<EFBC9C>ャモ÷}|{||{{zzyyyzyyyzzyyzzzz{|||{{{zyyzwvvwyxxxwzz{|{{{{{{{zy{yyyyxwuuvuvvwwxyz{|~€€рсту<D182>у<EFBFBD><EFBFBD><E38AA6><EFBFBD><EFBFBD>㈹㊦穴<E38AA6><E7A9B4><EFBFBD><EFBFBD>ュ演<E383A5>渇㊦<E6B887>褐級滑活旧級演㊤㈱㊧<E388B1><E38AA7><EFBFBD>沿<EFBFBD>у<EFBFBD>㊦㊤<E38AA4>㊦㊦<E38AA6><EFBFBD><E38AA5>усттモ€÷~}}~€=≠メ≠=a~≠€€≠ユ<E383A6>÷×€{|y{|{z|{zz}|}~<EFBD83>€<7F><7F>÷€тメ÷€}~~}€<7F>~~€|}~€÷~}|}±<ャ€÷€=}|yyzzz{|{||||~~€~{z|{{}||{||zzyzxwzwuxyz}~{yywwutpmppruwurkgljhjlkiljkqnowjltmnvч<76>㊥㊧旧旧欠<E697A7>轟薯崇末屆<E69CAB><EFBFBD>撥尹衍。囗蘭辨、ァ・・「棕<EFBDA2><E6A395>沱尢酎註苧<E8A8BB>丐」ァィィ、泅剽藍潔艶蕪視括賜槽ztkoxリ球}|yusu|€€~||<>装湯樗盗傑÷~z{{xtqoopprtwyyy{zyxxz~<><EFBD86>y{リ瑞刻随級葛沿<E8919B>~€ywsnhgkllnokhgjorstuvuttpoorvvvzystssqjfie`a^_\][VRSSOPRY]\[^cfggklmgb```^^\^abeedffeefggedfjooorqnljlrsvxy{}€~}||~€т<E289A0>€~}~€€€€~}}|||||{{||}~~~~~€€€€€=≠cャャャヤсャbャャモbbモbb======÷€€€€€€€€€€€€€€€€€€€€€€€€€€

1
assets/sfx_shot.raw Normal file
View File

@ -0,0 +1 @@
€~~€<>刻瑞葬曝悗・梺<EFBDA5>q`X[WVaknqzpg{uVT[O<4#9A3DRN]vw喬ゥウノテ・刎dcUGPHA`}v潔xuz~駐ヲムーュ「央tZU#&,A-+,AH<IMBa諮ョハスラ袤ラタ挧r<E68CA7>$Ehlq撈t_}。努`[f`d}<7D>負{z<>ュ匕モ<E58C95><EFBE93>屠pmFNjx|vhUC-(-Gv」チナムマュ旧ゥッィ「ェミ鉷zvZCmvz<76>hL_[f`>:+RbQcu}oiYTr箱。肌ウウソシッュ撓来<E69293>UBLWHG,!06+6L?3bf{東ウケュヲ硲オアゥ怏湯轄}~€f[^`T_jH[ZK^H[iZZTjlas}除翼y岳d\U肱ex疫`\e}{|€{<7B>~朽㍼}<7D><EFBFBD><EFBFBD>\qv{<7B>z|xhlkQPtw[]defhuu召助劔寺シ、ォ。<EFBDAB><EFBFBD>hWWX_XYdeheeprsqjkn||v∮秤召棘圍」撕<EFBDA3>結恤~vi]WV_VNRN^gXj<58>st|~孱服舞ゥエケセャョッィコキャ<EFBDB7>塩况w|kdnpNZgi}nx<6E>эゥ屓ヲ悛。「蕪中sywpkewjo陪€滑酷<E6BB91>草㍼炊zwwxvyv}苧割急}洛€朽pt€{qvdVaddm|レ€s漉酎㊨相}uvuregdZlZYnafoimnfx沿傑€<E58291>縁争月髄翠yu{~÷xx<78>z~snz}|ヤ{|<7C>z<EFBFBD><EFBFBD><7F>鋤椢抹翠裡糟剳椛博穴ビp~演<><E6BC94>騒刮肇、「・・圉摶刀~~{yx~tpsmpvns÷㊧{≦ypis€~{shgnwyollfn{rq}lmsfjcfq}ブzwpvu}|xzs{{x|umiigxн㊤<D0BD>z}y≠y}~~|~}xtouts|€<>歯萩<E6ADAF>㈹湯涛麹燈箔副囓沾抽瑞㍽泣<E38DBD>{€tpsz<73>㊥ф∴錘棟国舶争yvrgkojhbgtpmrssrvu|窮ユ€xtlgpst{<EFBD88>欠ф<E6ACA0><D184>ysfeks}~}|}с<><D181>轟書級怨≠<E680A8>|{}|€±yxzz{€€~<>渇ヤ<E6B887><E383A4>~yxv}<7D>}~~xyホvxvx}{zzx{∞諮脂<E8ABAE>草随脂<E99A8F><E88482>оリ潔x~<7E>髄衰穴モ~xz~~リ怨с€{yuqqlluz≠~yyxw{~<>奄{oikkrw{zuw}焔掩<E78494>}wsvz€ц訣穴<E8A8A3><E7A9B4>|zzyz}}|{|~≠~|x|~<><EFBD86><EFBFBD>×~ヨ割<E383A8>wsrqs}ヨ訣轟究a~~~~}÷~~~уф㊦℡€{vtsrrtrqqruwvx}ц<7F>旧克壕<E5858B>|xtsssvwwwvvx|€e葛演〟~}€<>€×{yz|ョ演℡<E6BC94>~~}}}}}{{}||}||||{}<7F>≧演沿㊧㊤<E38AA7>xwz€|zzz~у<EFBC9C><D183><EFBFBD><EFBC9D><EFBFBD>с~~|{{yxy{|}}ヤтa=~~}|}}}€モ=<ャメ~~}{zyy{}~~~€≠т<E289A0><EFBFBD><E38AA6>|{ywwxzzyy{}|}€€€€≠ャャモ=<сャ×}|||zz{{{zzxvwxz}~€€€€<C280>演㊥р÷~}{ywvvwyzz{{|~€≠ャт<E383A3><D182><EFBFBD>р€~}|{zyyz{|}~}|{||}}€у<EFBD84>ャモ€~~}}|}~~~€≠b€€€€€=÷€€€€€€~}}|||||}}~€€€=cャcттモ=€}||{zzyyyyz||}~€€≠ャャттモヤモ€~~~}||||}}}~~€=≠ャтсャb€~~~}}|||}~€€€~~~~~€€€€€≠bba€€€€~~}}||||||}~€€=≠bbba€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€

View File

@ -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

34
main.c
View File

@ -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++;

View File

@ -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");

142
sounds.h Normal file
View File

@ -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