1
1
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

228 lines
4.9 KiB

#include <SDL2/SDL_mutex.h>
#include <SDL2/SDL_scancode.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL2/SDL.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>
// only for mkdirat lol
#include <fcntl.h>
#include <sys/stat.h>
#include "logger.h"
#include "game.h"
#include "draw.h"
#include "garbo.h"
const int screen_width = 800;
const int screen_height = 600;
SDL_sem *resume;
struct SDL_Window* make_window(void) {
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
printf("error initializing SDL: %s\n", SDL_GetError());
}
return SDL_CreateWindow("sdl_tester",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
0, 0,
SDL_WINDOW_FULLSCREEN_DESKTOP);
}
void callbackfn(void *unused, Uint8 *stream, int len);
void callbackfn2(void *unused, Uint8 *stream, int len);
void callbackfn3(void *unused, Uint8 *stream, int len);
void start_audio(void) {
SDL_AudioSpec fmt = {.freq = 8000, .format = AUDIO_U8,.channels = 1, .samples=512};
fmt.callback = callbackfn3;
if (SDL_OpenAudio(&fmt, NULL) < 0) {
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
exit(1);
}
SDL_PauseAudio(0);
}
void stop_audio(void) {
SDL_CloseAudio();
}
unsigned int func1(int t) {
int note = 10;
if (!(t % 8000)) {
note = (1 + rand()) % 10 + 5;
printf("%d %d\n", t, note);
}
return ((t & 110) % 73 | (t % 1711));
}
unsigned int func0(int t) {
int note = 18;
if (t % 1240) {
note = (1 + rand()) % 18 + 1;
}
printf("%d %d\n", t, note);
fflush(stdout);
return (t % note);
}
void callbackfn3(void *unused, Uint8 *stream, int len) {
static int t = 1;
int i;
int yeet = rand();
for(i=0; i < len; i++,t++) {
stream[i] = func1(t);
}
}
void callbackfn2(void *unused, Uint8 *stream, int len) {
static int t = 1;
int i;
int yeet = rand();
for(i=0; i < len; i++,t++) {
stream[i] = func0(t);
}
}
void callbackfn(void *unused, Uint8 *stream, int len)
{
static int t = 0;
int i;
int yeet = rand();
for( i=0; i < len; i++,t++) {
/*
stream[i] = (t*5&(t>>7))|(t*3&(t>>8));
*/
//stream[i] = (( t >> 10 ) & 42) * t;
stream[i] = (t & yeet) % 73;
}
}
void redraw(struct SDL_Renderer * ren) {
SDL_RenderClear(ren);
redraw_buffer(ren);
SDL_RenderPresent(ren);
}
int physics_loop(void *ptr) {
game_paused = 1;
SDL_Delay(1000);
game_paused = 0;
while (1) {
if (step()) {
// display end level screen
game_paused = true;
SDL_Delay(1000);
SDL_PauseAudio(1);
in_game = false;
SDL_SemWait(resume);
add_time(level_time);
SDL_LockMutex(player.physics->lock);
game_paused = true;
next_level();
in_game = true;
SDL_UnlockMutex(player.physics->lock);
SDL_Delay(1000);
game_paused = 0;
SDL_PauseAudio(0);
}
}
}
int game(void) {
LOGLEVEL = DEBUG;
STDOUTLEVEL = DEBUG;
//SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "2" );
logwrite(INFO, "Starting\n");
SDL_Window * win = make_window();
SDL_Renderer * ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
// | SDL_RENDERER_PRESENTVSYNC);
queue_for_cleanup(win, WINDOW);
queue_for_cleanup(ren, RENDERER);
in_game = true;
resume = SDL_CreateSemaphore(0);
// IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG);
if (ren == NULL) {
SDL_DestroyWindow(win);
SDL_Quit();
}
TTF_Init();
int close = 0;
//draw_pictures(ren);
SDL_Thread *physics_thread;
int ignore;
startgame(ren);
physics_thread = SDL_CreateThread(physics_loop, "physics", (void *)ren);
while (!close) {
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
close = 1;
return 0;
case SDL_KEYDOWN:
if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) {
return 0;
}
if (!SDL_SemValue(resume)) {
SDL_SemPost(resume);
}
case SDL_KEYUP:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
handle_input_event (event);
}
}
/* Redraw Screen */
// step(10);
if (!in_game) {
draw_end_screen(ren);
} else {
redraw(ren);
}
}
}
int main (int argc, char** argv) {
mkdirat(AT_FDCWD, "saves", 0777);
start_audio();
game();
SDL_Quit();
//empty_cleanup_queue();
return 0;
}