summaryrefslogblamecommitdiffstats
path: root/crawl-ref/source/tilesdl.h
blob: 8e0812e35af72bc20635d85800cf513ed97a7cb6 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                            
                    

                    








                    
                         















                           
                    











                                                                  










                              

                                                                

                   
                                     

                  
                                                                               
 
                                                             
                                         

                              

                                
                                        

                                                       
                                 
                         

                            
                           
                             





                                                                 
                                                               



                                        


                                                   
 
                      
                          
 
                                                    
          
                                                       
                                                      

                                        

                                                   






                                  
                       




                     
                           












                                         



                                   
                                  

                            

                                   
 



                         
                     


                                   
                   
                   

                     
                                                                    









                                   


                        




                                     
                            
              
                     





                     
/*
 *  File:       tilesdl.h
 *  Summary:    SDL-related functionality for the tiles port
 *  Written by: Enne Walker
 */

#ifdef USE_TILE
#ifndef TILESDL_H
#define TILESDL_H

#include "externs.h"
#include "tilereg.h"

enum key_mod
{
    MOD_SHIFT = 0x1,
    MOD_CTRL  = 0x2,
    MOD_ALT   = 0x4
};

struct MouseEvent
{
    enum mouse_event_type
    {
        PRESS,
        RELEASE,
        MOVE
    };

    enum mouse_event_button
    {
        NONE        = 0x00,
        LEFT        = 0x01,
        MIDDLE      = 0x02,
        RIGHT       = 0x04,
        SCROLL_UP   = 0x08,
        SCROLL_DOWN = 0x10
    };

    // kind of event
    mouse_event_type event;
    // if PRESS or RELEASE, the button pressed
    mouse_event_button button;
    // bitwise-or of buttons currently pressed
    unsigned short held;
    // bitwise-or of key mods currently pressed
    unsigned char mod;
    // location of events in pixels and in window coordinate space
    unsigned int px;
    unsigned int py;
};

class SDL_Surface;
class FTFont;

class TilesFramework
{
public:
    TilesFramework();
    virtual ~TilesFramework();

    bool initialise();
    void shutdown();
    void load_dungeon(unsigned int *tileb, const coord_def &gc);
    void load_dungeon(const coord_def &gc);
    int getch_ck();
    void resize();
    void calculate_default_options();
    void clrscr();

    void message_out(int *which_line, int colour, const char *s, int firstcol);

    void cgotoxy(int x, int y, GotoRegion region = GOTO_CRT);
    GotoRegion get_cursor_region() const;
    int get_number_of_lines();
    int get_number_of_cols();
    void clear_message_window();

    void update_minimap(int gx, int gy);
    void update_minimap(int gx, int gy, map_feature f);
    void clear_minimap();
    void update_minimap_bounds();
    void update_spells();
    void update_inventory();

    void set_need_redraw();
    bool need_redraw() const;
    void redraw();

    void place_cursor(cursor_type type, const coord_def &gc);
    void clear_text_tags(text_tag_type type);
    void add_text_tag(text_tag_type type, const std::string &tag,
                      const coord_def &gc);
    void add_text_tag(text_tag_type type, const monsters* mon);

    bool initialise_items();

    const coord_def &get_cursor() const;

    void add_overlay(const coord_def &gc, int idx);
    void clear_overlays();

    void draw_title();
    void draw_doll_edit();

    MenuRegion *get_menu() { return m_region_menu; }
protected:
    int load_font(const char *font_file, int font_size,
                  bool default_on_fail, bool outline);
    int handle_mouse(MouseEvent &event);

    void use_control_region(ControlRegion *region);

    // screen pixel dimensions
    coord_def m_windowsz;
    // screen pixels per view cell
    coord_def m_viewsc;

    SDL_Surface* m_context;
    bool m_fullscreen;
    bool m_need_redraw;

    enum LayerID
    {
        LAYER_NORMAL,
        LAYER_CRT,
        LAYER_TILE_CONTROL,
        LAYER_MAX
    };

    class Layer
    {
    public:
        // Layers don't own these regions
        std::vector<Region*> m_regions;
    };
    Layer m_layers[LAYER_MAX];
    LayerID m_active_layer;

    // Normal layer
    DungeonRegion   *m_region_tile;
    StatRegion      *m_region_stat;
    MessageRegion   *m_region_msg;
    MapRegion       *m_region_map;
    InventoryRegion *m_region_inv;

    // Full-screen CRT layer
    CRTRegion       *m_region_crt;
    MenuRegion      *m_region_menu;

    struct font_info
    {
        std::string name;
        int size;
        bool outline;
        FTFont *font;
    };
    std::vector<font_info> m_fonts;
    int m_msg_font;
    int m_tip_font;

    void do_layout();
    bool layout_statcol(bool message_overlay, bool show_gold_turns);

    ImageManager m_image;

    // Mouse state.
    unsigned short m_buttons_held;
    unsigned char m_key_mod;
    coord_def m_mouse;
    unsigned int m_last_tick_moved;

    std::string m_tooltip;

    int m_screen_width;
    int m_screen_height;
};

// Main interface for tiles functions
extern TilesFramework tiles;

#ifdef TARGET_COMPILER_MINGW
#ifndef alloca
// Srsly, MinGW, wtf?
void *alloca(size_t);
#endif
#endif

#endif
#endif