// Hyperbolic Rogue -- fake mobile target
// Copyright (C) 2011-2018 Zeno Rogue, see 'hyper.cpp' for details

#define ISFAKEMOBILE 1
#define MOBPAR_FORMAL int
#define MOBPAR_ACTUAL 0
#define MIX_MAX_VOLUME 128
#define NOMAIN
#include <string>

namespace hr {
  const char *scorefile = "fakemobile_score.txt";  
  }

#include <SDL/SDL.h>

#include "hyper.cpp"

#include <SDL/SDL_ttf.h>
#include <SDL/SDL_gfxPrimitives.h>

#undef main

namespace hr {

transmatrix Orient = Id;

int lasttick = 0;

transmatrix getOrientation() { 
  int curtick = SDL_GetTicks();
  ld t = (curtick - lasttick) / 1000.0;
  lasttick = curtick;
  Uint8 *keystate = SDL_GetKeyState(NULL);
  if(keystate[SDLK_LCTRL]) {
    if(keystate['s']) Orient = Orient * cspin(2, 1, t);
    if(keystate['w']) Orient = Orient * cspin(1, 2, t);
    if(keystate['a']) Orient = Orient * cspin(2, 0, t);
    if(keystate['d']) Orient = Orient * cspin(0, 2, t);
    }
  return Orient;
  }

void resetmusic() { printf("resetmusic\n"); }

void playSound(cell *c, const string& fname, int vol) {
  printf("Play sound: %s\n", fname.c_str());
  }

SDL_Surface *s;

int gdpos = 0;

int gdpop() { return graphdata[gdpos++]; }

TTF_Font *font[256];

bool rawdisplaystr(int x, int y, int shift, int size, const char *str, int color, int align) {

  if(strlen(str) == 0) return false;

  if(size <= 0 || size > 255) {
    return false;
    }
  SDL_Color col;
  col.r = (color >> 16) & 255;
  col.g = (color >> 8 ) & 255;
  col.b = (color >> 0 ) & 255;
  
  col.r >>= darken; col.g >>= darken; col.b >>= darken;

  if(!font[size])
    font[size] = TTF_OpenFont("VeraBd.ttf", size);

  SDL_Surface *txt = TTF_RenderText_Solid(font[size], str, col);
  
  if(txt == NULL) return false;

  SDL_Rect rect;

  rect.w = txt->w;
  rect.h = txt->h;

  rect.x = x - rect.w * align / 16;
  rect.y = y - rect.h/2;
  
  bool clicked = (mousex >= rect.x && mousey >= rect.y && mousex <= rect.x+rect.w && mousey <= rect.y+rect.h);
  
  SDL_BlitSurface(txt, NULL, s,&rect); 
  SDL_FreeSurface(txt);
  
  return clicked;
  }

int textwidth(int siz, const string &str) {
  if(isize(str) == 0) return 0;
  
  if(!font[siz]) font[siz] = TTF_OpenFont("VeraBd.ttf", siz);
  
  int w, h;
  TTF_SizeUTF8(font[siz], str.c_str(), &w, &h);
  // printf("width = %d [%d]\n", w, isize(str));
  return w;
  }

char action;

bool currentlyConnecting() { return false; }
bool currentlyConnected() { return false; }
void viewAchievements() { printf("view Achievements\n"); }
void viewLeaderboard(string id) { printf("view Leaderboard :: %s\n", id.c_str()); }
void switchGoogleConnection() { printf("sgc\n"); }

void shareScore(int) {
  printf("share\n");
  }

void openURL() {
  printf("< openURL > \n");
  }

}

using namespace hr;

int main(int argc, char **argv) {

  initAll();
  glhr::init();
  
  vid.xres = 800; vid.yres = 450;
  vid.usingGL = false;
  // 450; vid.yres = 600;

  s= SDL_SetVideoMode(vid.xres, vid.yres, 32, 0);
  
  if(TTF_Init() != 0) {
    printf("Failed to initialize TTF.\n");
    exit(2);
    }

  int mx = 0; int my = 0; bool _clicked = false;
  
  inv::on = true;
  // firstland = laMinefield;
  // activateSafety(laWhirlwind);
  
  items[itGreenStone] = 100;
  // items[itDiamond] = 50;
  // for(int i=1; i<10; i++) kills[i] = 5;
  
  while(true) {
   
    SDL_LockSurface(s);
    memset(s->pixels, 0, vid.xres * vid.yres * 4);
    SDL_UnlockSurface(s);
    
    mousex = mx;
    mousey = my;
    clicked = _clicked;
    
    mobile_draw(MOBPAR_ACTUAL);
    action = 0;
    
    gdpos = 0;
    while(gdpos < isize(graphdata)) {
      switch(gdpop()) {
        case 2: {
          int x = gdpop(), y = gdpop(), al = gdpop();
          int color = gdpop();
          int size = gdpop();
          gdpop();
          int n = gdpop();
          string s;
          for(int i=0; i<n; i++) s += char(gdpop());
          rawdisplaystr(x, y, 0, size, s.c_str(), color, al);
          break;
          }
        
        case 1: {
          int col = gdpop();
          int otl = gdpop();
          int num = gdpop();
          
          Sint16 xpox[6000], xpoy[6000];
          
          // printf("%4d polygon %d\n", gdpos, num);
          for(int i=0; i<num; i++) xpox[i] = gdpop(), xpoy[i] = gdpop();

          filledPolygonColor(s, xpox, xpoy, num, col);
          aapolygonColor(s, xpox, xpoy, num, otl);
          break;
          }

        case 3: {
          int col = gdpop();
          int num = gdpop();

          for(int i=0; i<num; i++) polyx[i] = gdpop(), polyy[i] = gdpop();
          
          for(int i=0; i<num-1; i++)
            aalineColor(s, polyx[i], polyy[i], polyx[i+1], polyy[i+1], col);
          }

        case 4: {
          int col = gdpop();
          int out = gdpop();
          int x = gdpop(), y = gdpop(), rad = gdpop();
          
          aacircleColor(s, x, y, rad, (col << 8) + 0xFF);
          }

        case 5: {
          int out = gdpop();
          /* not implemented */
          }

        }
      }
    SDL_UpdateRect(s, 0, 0, vid.xres, vid.yres);

    SDL_Event ev;
    while(SDL_PollEvent(&ev)) {
    
      if(ev.type == SDL_MOUSEBUTTONDOWN) {
        mx = ev.button.x;
        my = ev.button.y;
        _clicked = true;
        }

      if(ev.type == SDL_MOUSEBUTTONUP) {
        _clicked = false;
        }

      if(ev.type == SDL_MOUSEMOTION) {
        mx = ev.motion.x;
        my = ev.motion.y;
        }
      
      if(ev.type == SDL_KEYDOWN) {
        int sym = ev.key.keysym.sym;
/*        if(sym == '1') {
  printf("Number of cells explored, by distance from the player:\n"); 
  for(int i=0; i<10; i++) printf(" %d", explore[i]); printf("\n");
          return 0;
          }
        else if(sym == '2') {
          items[rand() % ittypes] += 3;
          kills[rand() % motypes] += 3;
          }
        else if(sym == '3') {
          items[itHell] = 0;
          items[itGreenStone] = 100;
          }
        action = sym; */
        if(ev.key.keysym.mod & KMOD_LCTRL) continue;
        mousing = false;
        handlekey(sym, sym);
        }
        
      if(ev.type == SDL_QUIT) {
        SDL_Quit();
        return 0;
        }
      }
    }

  SDL_Quit();
  
  clearMemory();
  }