#ifndef SDL_H #define SDL_H #include "../player.h" // for races/class totals #define EVENT_TICK 1 #define EVENT_NET 2 #define EVENT_NET_ACCEPT 3 #define EVENT_NET_RECV 4 #define EVENT_NET_LOST 5 #define EVENT_NET_ERROR 6 #define EVENT_NET_CLIENT_RECV 7 #define EVENT_NET_CLIENT_LOST 8 #define EVENT_NET_CLIENT_ERROR 9 struct Font { int width; int height; int s_width; int s_height; float scale_x; float scale_y; SDL_Surface *spritesheet; SDL_Surface *scaled_spritesheet; }; struct Font font_mini; struct Font font_standard; struct Spritesheet { int width; int height; int s_width; int s_height; int columns; float scale_x; float scale_y; SDL_Surface *spritesheet; SDL_Surface *s_spritesheet; }; struct Spritesheet player_sprites; struct Spritesheet item_sprites; struct Spritesheet equip_sprites; struct Spritesheet shadow_sprites; struct Spritesheet npc_sprites; struct Spritesheet door_sprites; struct Spritesheet floor_sprites; struct Spritesheet wall_sprites; struct Spritesheet ui_sprites; SDL_Surface* screen; SDL_Surface* font_spritesheet; SDL_Surface* ui_spritesheet; SDL_Surface* camera_surface; SDL_Event event; Uint32 delay; // our delay in ms SDL_TimerID timer_id; // the timer id from SDL_AddTimer int g_video_width; int g_video_height; int g_video_mode; int g_video_fullscreen; // 0=windowed, 1=fullscreen float g_tile_scale_x; float g_tile_scale_y; float g_tile_width; float g_tile_height; /* helper stuff */ Uint32 combinepixels(Uint32 pixel_1, Uint32 pixel_2); /* --- tile stuff --- */ void consoleScaleTiles(const char *input_string); void interfaceSetScale(float scale_x, float scale_y); void loadSpritesheetFromMemory(struct Spritesheet *spritesheet, unsigned char *memory, unsigned int length, int width, int height, int columns); void freeSpritesheet(struct Spritesheet *spritesheet); void setSpritesheetScale(struct Spritesheet *spritesheet, float scale_x, float scale_y); // TODO: drawSprite/drawScaledSprite should probably be the same function that uses a flag to use either the scaled or non-scaled surface void drawSprite(struct Spritesheet *spritesheet, int id, SDL_Surface *target_surface, int start_x, int start_y); void drawScaledSprite(struct Spritesheet *spritesheet, int id, SDL_Surface *target_surface, int start_x, int start_y); void drawScaledTransparentSprite(struct Spritesheet *spritesheet, int id, double opacity, SDL_Surface *target_surface, int start_x, int start_y); void drawScaledSpriteOutline(struct Spritesheet *spritesheet, int id, SDL_Surface *target_surface, int start_x, int start_y); /* --- core drawing stuff --- */ void interfaceDrawString(SDL_Surface *to_surface, const char *string, int start_x, int start_y); void interfaceDrawChar(SDL_Surface *to_surface, char ch, int start_x, int start_y); void interfaceDrawStringF(struct Font *font, SDL_Surface *to_surface, const char *string, int start_x, int start_y); void interfaceDrawCharF(struct Font *font, SDL_Surface *to_surface, char ch, int start_x, int start_y); SDL_Surface *interfaceScaleSurface(SDL_Surface *surface, float scale_x, float scale_y); SDL_Surface *interfaceSmoothScaleSurface(SDL_Surface *surface, float scale_x, float scale_y); void SDL_CopySurface(SDL_Surface *from_surface, SDL_Rect *from_rect, SDL_Surface *to_surface, SDL_Rect *to_rect); void SDL_SetOpacity(SDL_Surface *surface, double percent); SDL_Surface *SDL_ScaleSurface(SDL_Surface *surface, float scale_x, float scale_y); /* --- ui related stuff --- */ float g_ui_scale_x; float g_ui_scale_y; #define UI_HOTBAR_ITEM_HEIGHT 32 #define UI_HOTBAR_ITEM_WIDTH 32 SDL_Surface *ui_messages_surface; SDL_Rect *ui_messages_target_rect; float g_hotbar_scale_x; float g_hotbar_scale_y; SDL_Surface *ui_hotbar_surface; SDL_Rect *ui_hotbar_target_rect; int uiInit(); void uiDraw(); void uiSetScale(float scale_x, float scale_y); /* --- --- */ void interfaceDrawInventory(); /* --- video related stuff --- */ /*** This function takes an input string in the following format to set g_video_width, g_video_height, and g_video_fullscreen appropriately: WIDTHxHEIGHT 0|1 TODO: rename to consoleVideoSetSize or something similar to specify its nature as a console command ***/ void interfaceVideoSetSize(const char *input_string); /*** interfaceVideoSet This function recreates the screen with the values from g_video_width, g_video_height, and g_video_fullscreen then frees and recreates the camera_surface. ***/ int interfaceVideoSet(); /* --- font-related stuff --- */ /*** loadFontFromMemory This function populates the passed Font structure by taking the passed memory and making an SDL_Surface from it and setting the width and height accordingly (as well as scale_x and scale_y. ***/ void loadFontFromMemory(struct Font *font, unsigned char *memory, unsigned int length, int width, int height); /*** freeFont This function should be called after populating a Font structure via loadFontFromMemory - it simply frees the scaled_spritesheet and spritesheet of the struct. ***/ void freeFont(struct Font *font); /*** setFontScale This function sets the scale_x and scale_y properties of the passed struct to the passed values and creates a new SDL_Surface pointed to be scaled_spritesheet at the appropriate scale - this is acquired by using interfaceScaleSurface on the struct's spritesheet. ***/ void setFontScale(struct Font *font, float scale_x, float scale_y); static int networkThread(void *nada); SDL_Thread *network_thread; Uint32 pushTickEvent(Uint32 interval, void *param); #endif