mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-29 04:47:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			285 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Hyperbolic Rogue -- fake mobile target
 | |
| // Copyright (C) 2011-2018 Zeno Rogue, see 'hyper.cpp' for details
 | |
| //
 | |
| // Compile with: g++ fake-mobile.cpp -o fake-mobile -I/usr/include/SDL -lSDL -lSDL_gfx -lGL -lSDL_ttf -lz -Wno-invalid-offsetof
 | |
| 
 | |
| #define ISFAKEMOBILE 1
 | |
| #define MOBPAR_FORMAL int
 | |
| #define MOBPAR_ACTUAL 0
 | |
| #define MIX_MAX_VOLUME 128
 | |
| #define NOMAIN
 | |
| #include <string>
 | |
| 
 | |
| namespace hr {
 | |
|   std::string 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];
 | |
| 
 | |
| const char* fontname = "DejaVuSans-Bold.ttf";
 | |
| 
 | |
| void load_font() {
 | |
|   if(!font[size])
 | |
|     font[size] = TTF_OpenFont(fontname, size);
 | |
|   if(!font[size]) {
 | |
|     fprintf(stderr, "failed to open font: %s", fontname);
 | |
|     exit(1);
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 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;
 | |
| 
 | |
|   load_font();
 | |
| 
 | |
|   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;
 | |
|   
 | |
|   load_font();
 | |
|   
 | |
|   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();
 | |
|   }
 | |
| 
 | 
