diff --git a/cowsdl12.c b/cowsdl12.c new file mode 100644 index 0000000..78174bc --- /dev/null +++ b/cowsdl12.c @@ -0,0 +1,58 @@ +/* + * cowsdl12.c: see cowsdl12.h. The game draws on the surface of SDL_SetVideoMode (here a 16-bit RGB565 + * surface in memory, as the game asks for); each SDL_Flip uploads it to a streaming texture and shows it. + * Copyright (C) 2026 FredyGames. Distributed under the GNU GPL version 3 or later, like the game. + */ +#include "cowsdl12.h" + +#undef SDL_SetColorKey + +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; +static SDL_Texture *texture = NULL; +static SDL_Surface *screen = NULL; + +SDL_Surface *cow_SetVideoMode(int width, int height, int bpp, Uint32 flags) +{ + (void)bpp; (void)flags; + if (window == NULL) { + if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0) + return NULL; + window = SDL_CreateWindow("Curse of War", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, 0); + if (window == NULL) + return NULL; + renderer = SDL_CreateRenderer(window, -1, 0); + if (renderer == NULL) + return NULL; + } + if (texture != NULL) + SDL_DestroyTexture(texture); + if (screen != NULL) + SDL_FreeSurface(screen); + SDL_SetWindowSize(window, width, height); + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, width, height); + screen = SDL_CreateRGBSurfaceWithFormat(0, width, height, 16, SDL_PIXELFORMAT_RGB565); + return screen; +} + +int cow_Flip(SDL_Surface *surface) +{ + if (surface != screen || texture == NULL) + return -1; + SDL_UpdateTexture(texture, NULL, screen->pixels, screen->pitch); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + return 0; +} + +/* Converts to the format of the screen; the color key (if any) goes along. */ +SDL_Surface *cow_DisplayFormat(SDL_Surface *surface) +{ + return SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_RGB565, 0); +} + +int cow_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key) +{ + return SDL_SetColorKey(surface, (flag & SDL_SRCCOLORKEY) ? SDL_TRUE : SDL_FALSE, key); +} diff --git a/cowsdl12.h b/cowsdl12.h new file mode 100644 index 0000000..736e3f5 --- /dev/null +++ b/cowsdl12.h @@ -0,0 +1,32 @@ +/* + * cowsdl12.h: the part of the SDL 1.2 API that Curse of War uses, on top of SDL 2, for the fredygames.com + * browser build (Emscripten). Included before every source file (-include). Written for that build. + * Copyright (C) 2026 FredyGames. Distributed under the GNU GPL version 3 or later, like the game. + */ +#ifndef COWSDL12_H +#define COWSDL12_H + +#include +#include + +#define SDL_SWSURFACE 0x00000000 +#define SDL_DOUBLEBUF 0x40000000 +#define SDL_SRCCOLORKEY 0x00001000 +#define SDL_RLEACCEL 0x00004000 + +SDL_Surface *cow_SetVideoMode(int width, int height, int bpp, Uint32 flags); +int cow_Flip(SDL_Surface *screen); +SDL_Surface *cow_DisplayFormat(SDL_Surface *surface); +int cow_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key); + +#define SDL_SetVideoMode cow_SetVideoMode +#define SDL_Flip cow_Flip +#define SDL_DisplayFormat cow_DisplayFormat +#define SDL_SetColorKey cow_SetColorKey +#define SDL_EnableUNICODE(on) (0) +#define SDL_EnableKeyRepeat(delay, interval) (0) +/* The main loop waits for the next tick with SDL_Delay: here that hands the page back to the browser (Asyncify). */ +#undef SDL_Delay +#define SDL_Delay(ms) emscripten_sleep(ms) + +#endif diff --git a/main-common.c b/main-common.c index f1f2fb7..543bb7c 100644 --- a/main-common.c +++ b/main-common.c @@ -75,14 +75,6 @@ void print_help() { "\tSpecify a random seed (unsigned integer) for map generation.\n\n" "-T\n" "\tShow the timeline.\n\n" - "-E [1|2| ... L]\n" - "\tStart a server for not more than L clients.\n\n" - "-e port\n" - "\tServer's port (19140 is default).\n\n" - "-C IP\n" - "\tStart a client and connect to the provided server's IP-address.\n\n" - "-c port\n" - "\tClients's port (19150 is default).\n\n" "-v\n" "\tDisplay the version number\n\n" "-h\n" @@ -163,7 +155,7 @@ int get_options(int argc, char *argv[], struct basic_options *op, struct multi_o #ifndef NOGETOPT opterr = 0; int c; - while ((c = getopt (argc, argv, "hvrTW:H:i:l:q:d:s:R:S:E:e:C:c:")) != -1){ + while ((c = getopt (argc, argv, "hvrTW:H:i:l:q:d:s:R:S:")) != -1){ switch(c){ case 'r': op->keep_random_flag = 1; break; case 'T': op->timeline_flag = 1; break; @@ -252,31 +244,6 @@ int get_options(int argc, char *argv[], struct basic_options *op, struct multi_o } break; - /* multiplayer-related options */ - case 'E': { char* endptr = NULL; - mop->clients_num = strtol(optarg, &endptr, 10); - if (*endptr != '\0') { - print_help(); - return 1; - } - mop->multiplayer_flag = 1; - mop->server_flag = 1; - } - break; - case 'e': - free(mop->val_server_port); - mop->val_server_port = strdup(optarg); - break; - case 'C': - mop->multiplayer_flag = 1; - mop->server_flag = 0; - free(mop->val_server_addr); - mop->val_server_addr = strdup(optarg); - break; - case 'c': - free(mop->val_client_port); - mop->val_client_port = strdup(optarg); - break; case 'v': printf("%s\n", VERSION); return 1; diff --git a/main-sdl.c b/main-sdl.c index 079df17..84e30db 100644 --- a/main-sdl.c +++ b/main-sdl.c @@ -33,13 +33,6 @@ #include "main-common.h" #include "path.h" -/* no networking in Windows */ -#ifndef WIN32 -#include -#include "messaging.h" -#include "client.h" -#include "server.h" -#endif /* delay in milliseconds */ #define TIME_DELAY 10 @@ -75,20 +68,21 @@ void run(struct state *st, struct ui *ui, while (!finished && SDL_PollEvent(&event)){ switch (event.type){ case SDL_KEYDOWN: + /* SDL 2 has no keysym.unicode: arrows come from the key press, letters from SDL_TEXTINPUT. */ c = '\0'; switch (event.key.keysym.sym) { case SDLK_LEFT: c = 'h'; break; case SDLK_RIGHT: c = 'l'; break; case SDLK_UP: c = 'k'; break; case SDLK_DOWN: c = 'j'; break; - case SDLK_q: c = 'q'; break; - case SDLK_SPACE: c = ' '; break; - default: - if ( (event.key.keysym.unicode & 0xFF80) == 0 ) { - c = event.key.keysym.unicode & 0x7F; - } + default: break; } - finished = singleplayer_process_input(st, ui, c); + if (c != '\0') finished = singleplayer_process_input(st, ui, c); + break; + case SDL_TEXTINPUT: + c = event.text.text[0]; + if (c != '\0' && (c & 0x80) == 0) + finished = singleplayer_process_input(st, ui, c); break; } } @@ -110,122 +104,6 @@ void run(struct state *st, struct ui *ui, } } -#ifndef WIN32 -/* Client version */ -void run_client(struct state *st, struct ui *ui, - SDL_Surface *screen, SDL_Surface *tileset, SDL_Surface *typeface, SDL_Surface *uisurf, - char *s_server_addr, char *s_server_port, char *s_client_port){ - /* tile variation */ - int tile_variant[MAX_WIDTH][MAX_HEIGHT]; - int pop_variant[MAX_WIDTH][MAX_HEIGHT]; - int i, j; - for (i=0; itime = 0; - while (!finished){ - - int time = SDL_GetTicks(); - - if (time - previous_time >= TIME_DELAY) { - - previous_time = previous_time + TIME_DELAY; - k++; - if (k>=1600) k=0; - - char c = '\0'; - while (!finished && SDL_PollEvent(&event)){ - switch (event.type){ - case SDL_KEYDOWN: - c = '\0'; - switch (event.key.keysym.sym) { - case SDLK_LEFT: c = 'h'; break; - case SDLK_RIGHT: c = 'l'; break; - case SDLK_UP: c = 'k'; break; - case SDLK_DOWN: c = 'j'; break; - case SDLK_q: c = 'q'; break; - case SDLK_SPACE: c = ' '; break; - default: - if ( (event.key.keysym.unicode & 0xFF80) == 0 ) { - c = event.key.keysym.unicode & 0x7F; - } - } - /* finished = singleplayer_process_input(st, ui, c); */ - finished = client_process_input (st, ui, c, sfd, &srv_addr); - /* */ - break; - } - } - - /* Send Keep Alive & receive packets */ - if (k%50 == 0) - send_msg_c (sfd, &srv_addr, MSG_C_IS_ALIVE, 0, 0, 0); - - int msg = client_receive_msg_s (sfd, st); - if (msg == MSG_S_STATE && initialized != 1) { - initialized = 1; - ui_init(st, ui); - - /* reset screen */ - int screen_width = (ui->xlength + 2) * TILE_WIDTH; - int screen_height = (st->grid.height + 3) * TILE_HEIGHT + TYPE_HEIGHT*5; - screen_width = MAX (screen_width, TILE_WIDTH + 75*TYPE_WIDTH + TILE_WIDTH); - SDL_FreeSurface(screen); - screen = SDL_SetVideoMode(screen_width, screen_height, 16, SDL_DOUBLEBUF); - if (screen == NULL) { - fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError()); - exit(1); - } - /* */ - } - /* */ - - /* no simulation in the client */ - /* - int slowdown = game_slowdown(st->speed); - if (k % slowdown == 0 && st->speed != sp_pause) { - kings_move(st); - simulate(st); - } - */ - - if (initialized) { - if (k % 5 == 0) { - output_sdl(tileset, typeface, uisurf, screen, st, ui, tile_variant, pop_variant, k); - SDL_Flip(screen); - } - } - - } - else{ - SDL_Delay(TIME_DELAY/2); - } - } -} -#endif - int main(int argc, char *argv[]) { srand(time(NULL)); @@ -285,30 +163,15 @@ int main(int argc, char *argv[]) { if ( load_image(filename, &uisurf) != 0 ) return 1; free(filename); -#ifdef WIN32 /* Run the game */ run(&st, &ui, screen, tileset, typeface, uisurf); -#else - if (!mop.multiplayer_flag) { - /* Run the game */ - run(&st, &ui, screen, tileset, typeface, uisurf); - } - else { - if (mop.server_flag) { - fprintf(stderr, "\nPlease, run the ncurses executable to start a server.\n\n"); - exit(1); - } - else run_client(&st, &ui, screen, tileset, typeface, uisurf, mop.val_server_addr, mop.val_server_port, mop.val_client_port); - } -#endif /* Finalize */ SDL_FreeSurface(tileset); SDL_FreeSurface(typeface); SDL_FreeSurface(uisurf); - if (!mop.multiplayer_flag || mop.server_flag) - printf ("Random seed was %i\n", st.map_seed); + printf ("Random seed was %i\n", st.map_seed); destroy_search_paths(path); free(mop.val_client_port);