diff --git a/data b/data index 416446e..2dc5705 100644 --- a/data +++ b/data @@ -137,3 +137,8 @@ details #RLCtiny1 00'10'659;00LCtiny1;ae1ab677 0000323:0011:0389:0021:00b9:0041:0039:0031:0149:0091:0183:0031:00d3:00c1:0065:0047:0033:0051:00b3:0181:0069:0011:0175:0041:0203:0061:00a9:0041:0093:0061 #BLCtiny1; #RLCtiny1 00'10'098;00LCtiny1;ae1ab677 0000306:0011:00e9:0041:0203:0031:0099:0031:00a9:0021:0149:00d1:0103:0061:00d3:0031:0083:00c5:0081:0023:01f1:00a9:0061:00c5:0041:01b9:0031:0133:0041:0089 +#RLCtiny3 00'26'136;00LCtiny3;df0bd8ce 0000792:0011:0143:0041:00b3:0051:0049:00a1:0053:0051:00d9:0041:0159:0031:0469:0051:0043:0061:0059:0061:0069:0241:0233:0081:0073:0031:0069:0041:00f9:0041:0193:0061:0093:0051:0123:00a1:0063:0091:00c3:00f1:00a3:0041:0179:00b1:0063:00f1:0303:0041:00a9:0061:0049:0061:0089:01f1:0063:0071:0299:0031:0063:0031:0099:0041:00d3:00d1:01d3:0041:0139 +#BLCtiny3; +#RLCtiny5 00'10'362;00LCtiny5;5c14d8b6 0000314:00a1:0179:00a1:0089:0071:0093:0031:00c3:0041:0059:0031:0023:0161:0033:0081:0083:0051:0049:0131:0053:0091:0093:0041:00a3:00d1:0063:0051:0093:0041:0293:00a1:0149:0031 +#BLCtiny5; +#RLCtiny5 00'09'240;00LCtiny5;5c14d8b6 0000280:0011:00b3:0051:0049:0061:0099:0091:0059:0041:0059:0041:0079:0021:0093:0061:0059:0033:0181:0119:0051:0079:0051:0033:0071:00b3:0091:0033:0071:0043:0031:0033:0051:03d3:0031:0079 diff --git a/frontend_csfml.c b/frontend_csfml.c new file mode 100644 index 0000000..313d43a --- /dev/null +++ b/frontend_csfml.c @@ -0,0 +1,227 @@ +/** + CSFML frontend for Licar. +*/ + +#include +#include +#include +#include +#include +#include + +#define LCR_SETTING_LOG_LEVEL 2 +#define DATA_FILE_NAME "data" + +//#define LCR_LOADING_COMMAND SDL_PumpEvents(); + +// #define LCR_FPS_GET_MS SDL_GetTicks() // uncomment for FPS measuring + +#include "game.h" + +#define WINDOW_SIZE (LCR_SETTING_RESOLUTION_X * LCR_SETTING_RESOLUTION_Y) + +sfUint32 windowPixels[WINDOW_SIZE * 2]; +uint8_t fullscreen = 1; +FILE *musicFile = 0; +FILE *dataFile = 0; +sfClock *clock; +sfRenderWindow* window; +sfSoundStream *sound; + +#define AUDIO_BUFFER_SIZE 256 + +int16_t audioBuffer[AUDIO_BUFFER_SIZE]; +uint8_t musicBuffer[AUDIO_BUFFER_SIZE]; + +char LCR_getNextDataFileChar(void) +{ + if (!dataFile) + return 0; + + int c = fgetc(dataFile); + + if (c == EOF) + { + rewind(dataFile); + return 0; + } + + return c; +} + +void LCR_appendDataStr(const char *str) +{ + fclose(dataFile); + + dataFile = fopen(DATA_FILE_NAME,"a"); + + if (dataFile) + { + fprintf(dataFile,"%s",str); + fclose(dataFile); + dataFile = fopen(DATA_FILE_NAME,"r"); + } +} + +uint8_t LCR_keyPressed(uint8_t key) +{ + #define k(x) sfKeyboard_isKeyPressed(sfKey ## x) + + switch (key) + { + case LCR_KEY_UP: return k(W) || k(Up) || k(Num8); break; + case LCR_KEY_RIGHT: return k(E) || k(Right) || k(Num6); break; + case LCR_KEY_DOWN: return k(S) || k(Down) || k(Num5) || k(Num2); break; + case LCR_KEY_LEFT: return k(Q) || k(Left) || k(Num4); break; + case LCR_KEY_A: return k(K) || k(Return); break; + case LCR_KEY_B: return k(L) || k(Escape); break; + default: break; + } + + return 0; +} + +void LCR_sleep(uint16_t timeMs) +{ + sfTime t; + t.microseconds = timeMs * 1000; + sfSleep(t); +} + +void LCR_drawPixel(unsigned long index, uint16_t color) +{ + windowPixels[index] = 0xff000000 | ((color & 0x07e0) << 5) | + (((color << 19) | (color >> 8)) & 0x00f800f8) ; +} + +void LCR_log(const char *str) +{ + printf("LOG: %s\n",str); +} + +void printHelp(void) +{ + printf( + "Licar, 3D racing game, v. " LCR_VERSION ", CSFML frontend, args:\n" + " -h print help and quit\n" + " -wN window (N = 1) or fullscreen (N = 0)\n" + LCR_ARG_HELP_STR); +} + +sfBool soundFill(sfSoundStreamChunk *data, void *userdata) +{ + if (musicFile && LCR_gameMusicOn()) + { + if (!fread(musicBuffer,1,AUDIO_BUFFER_SIZE,musicFile)) + rewind(musicFile); + + for (int i = 0; i < AUDIO_BUFFER_SIZE; ++i) + audioBuffer[i] = musicBuffer[i]; + } + else + for (int i = 0; i < AUDIO_BUFFER_SIZE; ++i) + audioBuffer[i] = 127; + + for (int i = 0; i < AUDIO_BUFFER_SIZE; ++i) + audioBuffer[i] = + (audioBuffer[i] + LCR_gameGetNextAudioSample() - 255) * 64; + + data->samples = audioBuffer; + data->sampleCount = AUDIO_BUFFER_SIZE; + + return sfTrue; +} + +void soundSeek(sfTime t, void *userData) +{ +} + +int main(int argc, char *argv[]) +{ + for (int i = 0; i < argc; ++i) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'h': printHelp(); return 0; break; + case 'w': fullscreen = argv[i][2] == '0'; break; + default: break; + } + + dataFile = fopen(DATA_FILE_NAME,"r"); + + if (!dataFile) + LCR_log("couldn't open data file"); + + musicFile = fopen("assets/music","rb"); + + if (!musicFile) + fputs("could not open music file",stderr); + + LCR_log("initializing game"); + LCR_gameInit(argc,(const char **) argv); + + LCR_log("initializing SFML"); + sfVideoMode mode = {LCR_SETTING_RESOLUTION_X,LCR_SETTING_RESOLUTION_Y,32}; + sfEvent event; + clock = sfClock_create(); + sfClock_restart(clock); + + LCR_log("initializing audio"); + + for (int i = 0; i < AUDIO_BUFFER_SIZE; ++i) + audioBuffer[i] = 0; + + sound = sfSoundStream_create(soundFill,soundSeek,1,8000,0); + + sfTexture* windowTexture = + sfTexture_create(LCR_SETTING_RESOLUTION_X,LCR_SETTING_RESOLUTION_Y); + + sfTexture_setSmooth(windowTexture,sfTrue); + + sfSprite* windowSprite = sfSprite_create(); + + window = sfRenderWindow_create(mode,"Licar", + fullscreen ? sfFullscreen : (sfResize | sfClose ),NULL); + + sfSprite_setTexture(windowSprite,windowTexture,sfTrue); + sfWindow_setVerticalSyncEnabled((sfWindow *) window,sfFalse); + + sfSoundStream_play(sound); + + puts("starting"); + + while (sfRenderWindow_isOpen(window)) + { + while (sfRenderWindow_pollEvent(window,&event)) + if (event.type == sfEvtClosed) + sfRenderWindow_close(window); + + if (!LCR_gameStep(sfClock_getElapsedTime(clock).microseconds / 1000)) + break; + + sfTexture_updateFromPixels(windowTexture,(const sfUint8 *) windowPixels, + LCR_SETTING_RESOLUTION_X,LCR_SETTING_RESOLUTION_Y,0,0); + sfRenderWindow_clear(window,sfBlack); + sfRenderWindow_drawSprite(window,windowSprite,NULL); + sfRenderWindow_display(window); + } + + LCR_log("ending"); + + if (musicFile) + fclose(musicFile); + + if (dataFile) + fclose(dataFile); + + sfSoundStream_stop(sound); + sfSoundStream_destroy(sound); + sfSprite_destroy(windowSprite); + sfTexture_destroy(windowTexture); + sfRenderWindow_destroy(window); + sfClock_destroy(clock); + + LCR_gameEnd(); + + return 0; +} diff --git a/make.sh b/make.sh index be35b8a..3c59302 100755 --- a/make.sh +++ b/make.sh @@ -31,18 +31,24 @@ fi if [ $PLATFORM = "sdl" ]; then # PC SDL build, requires: - # - g++ # - SDL2 (dev) package SDL_FLAGS=`sdl2-config --cflags --libs` - ${COMPILER} ${C_FLAGS} frontend_sdl.c -I/usr/local/include ${SDL_FLAGS} + COMMAND="${COMPILER} ${C_FLAGS} frontend_sdl.c -I/usr/local/include ${SDL_FLAGS}" +elif [ $PLATFORM = "csfml" ]; then + # PC CMFML build, requires: + # - csfml (dev) package + + COMMAND="${COMPILER} ${C_FLAGS} frontend_csfml.c -lcsfml-graphics -lcsfml-window -lcsfml-system -lcsfml-audio" elif [ $PLATFORM = "emscripten" ]; then # emscripten (browser Javascript) build, requires: # - emscripten -# COMMAND="../emsdk/upstream/emscripten/emcc ./frontend_sdl.c -s USE_SDL=2 -O3 -lopenal --shell-file HTMLshell.html -o licar.html -s EXPORTED_FUNCTIONS=\'[\"_main\",\"_webButton\"]\' -s EXPORTED_RUNTIME_METHODS=\'[\"ccall\",\"cwrap\"]\'" - ../emsdk/upstream/emscripten/emcc ./frontend_sdl.c -s USE_SDL=2 -O3 -lopenal --shell-file HTMLshell.html -o licar.html -s EXPORTED_FUNCTIONS='["_main","_webButton"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' + COMMAND="../emsdk/upstream/emscripten/emcc ./frontend_sdl.c -s USE_SDL=2 -O3 -lopenal --shell-file HTMLshell.html -o licar.html -s EXPORTED_FUNCTIONS='[\"_main\",\"_webButton\"]' -s EXPORTED_RUNTIME_METHODS='[\"ccall\",\"cwrap\"]'" else echo "unknown frontend" fi +echo ${COMMAND} +eval ${COMMAND} + echo "done"