HyperRogue ported to SDL2 (in mymake do -sdl2)

This commit is contained in:
Zeno Rogue 2021-03-06 14:53:25 +01:00
parent 87cbfaeac3
commit f00696711a
12 changed files with 396 additions and 87 deletions

View File

@ -130,8 +130,21 @@ void fix_font_size(int& size) {
#endif
#if CAP_SDL
#if !CAP_SDL2
#if HDR
typedef SDL_Surface SDL_Renderer
#define srend s
#endif
#endif
EX SDL_Surface *s;
EX SDL_Surface *s_screen;
#if CAP_SDL2
EX SDL_Renderer *srend;
EX SDL_Texture *s_texture;
EX SDL_Window *s_window;
#endif
EX color_t qpixel_pixel_outside;
@ -143,6 +156,31 @@ EX color_t& qpixel(SDL_Surface *surf, int x, int y) {
return pi[x];
}
EX void present_surface() {
#if CAP_SDL2
SDL_UpdateTexture(s_texture, NULL, s, s->w * sizeof (Uint32));
SDL_RenderClear(srend);
SDL_RenderCopy(srend, s_texture, NULL, NULL);
SDL_RenderPresent(srend);
#else
SDL_UpdateRect(s, 0, 0, 0, 0);
#endif
}
EX void present_screen() {
#if CAP_GL
if(vid.usingGL) {
#if CAP_SDL2
SDL_GL_SwapWindow(s_window);
#else
SDL_GL_SwapBuffers();
#endif
return;
}
#endif
present_surface();
}
#endif
#if CAP_SDLTTF
@ -733,7 +771,11 @@ EX bool displaystr(int x, int y, int shift, int size, const char *str, color_t c
bool clicked = (mousex >= rect.x && mousey >= rect.y && mousex <= rect.x+rect.w && mousey <= rect.y+rect.h);
if(shift) {
#if CAP_SDL2
SDL_Surface* txt2 = SDL_ConvertSurfaceFormat(txt, SDL_PIXELFORMAT_RGBA8888, 0);
#else
SDL_Surface* txt2 = SDL_DisplayFormat(txt);
#endif
SDL_LockSurface(txt2);
SDL_LockSurface(s);
color_t c0 = qpixel(txt2, 0, 0);
@ -993,12 +1035,12 @@ EX void drawCircle(int x, int y, int size, color_t color, color_t fillcolor IS(0
gdpush(4); gdpush(color); gdpush(x); gdpush(y); gdpush(size);
#elif CAP_SDLGFX
if(pconf.stretch == 1) {
if(fillcolor) filledCircleColor(s, x, y, size, fillcolor);
if(color) ((vid.antialias && AA_NOGL)?aacircleColor:circleColor) (s, x, y, size, color);
if(fillcolor) filledCircleColor(srend, x, y, size, fillcolor);
if(color) ((vid.antialias && AA_NOGL)?aacircleColor:circleColor) (srend, x, y, size, color);
}
else {
if(fillcolor) filledEllipseColor(s, x, y, size, size * pconf.stretch, fillcolor);
if(color) ((vid.antialias && AA_NOGL)?aaellipseColor:ellipseColor) (s, x, y, size, size * pconf.stretch, color);
if(fillcolor) filledEllipseColor(srend, x, y, size, size * pconf.stretch, fillcolor);
if(color) ((vid.antialias && AA_NOGL)?aaellipseColor:ellipseColor) (srend, x, y, size, size * pconf.stretch, color);
}
#elif CAP_SDL
int pts = size * 4;
@ -1109,6 +1151,10 @@ EX pair<int, int> get_requested_resolution() {
return { vid.window_x, vid.window_y };
}
#ifndef CUSTOM_CAPTION
#define CUSTOM_CAPTION ("HyperRogue " VER)
#endif
#if CAP_SDL
EX void setvideomode() {
@ -1127,11 +1173,12 @@ EX void setvideomode() {
#if CAP_GL
vid.usingGL = vid.wantGL;
if(vid.usingGL) {
flags = SDL_OPENGL | SDL_HWSURFACE;
flags = SDL12(SDL_OPENGL | SDL_HWSURFACE, SDL_WINDOW_OPENGL);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
vid.current_vsync = want_vsync();
#if !ISMOBWEB
#if !ISMOBWEB && !CAP_SDL2
if(vid.current_vsync)
SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 );
else
@ -1146,7 +1193,7 @@ EX void setvideomode() {
vid.usingGL = false;
#endif
int sizeflag = (vid.full ? SDL_FULLSCREEN : SDL_RESIZABLE);
int sizeflag = SDL12(vid.full ? SDL_FULLSCREEN : SDL_RESIZABLE, vid.full ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE);
#ifdef WINDOWS
#ifndef OLD_MINGW
@ -1167,23 +1214,49 @@ EX void setvideomode() {
#endif
#endif
s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | sizeflag);
auto create_win = [&] {
#if CAP_SDL2
if(s_window) SDL_DestroyWindow(s_window);
s_window = SDL_CreateWindow(CUSTOM_CAPTION, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
vid.xres, vid.yres,
flags | sizeflag
);
#else
s = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | sizeflag);
#endif
};
create_win();
if(vid.full && !s) {
vid.xres = vid.xscr;
vid.yres = vid.yscr;
vid.fsize = 10;
s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | SDL_FULLSCREEN);
sizeflag = SDL12(SDL_FULLSCREEN, SDL_WINDOW_FULLSCREEN);
create_win();
}
if(!s) {
addMessage("Failed to set the graphical mode: "+its(vid.xres)+"x"+its(vid.yres)+(vid.full ? " fullscreen" : " windowed"));
vid.xres = 640;
vid.yres = 480;
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
vid.antialias &= ~AA_MULTI;
s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | SDL_RESIZABLE);
sizeflag = SDL12(SDL_RESIZABLE, SDL_WINDOW_RESIZABLE);
create_win();
}
#if CAP_SDL2
if(srend) SDL_DestroyRenderer(srend);
srend = SDL_CreateRenderer(s_window, -1, vid.current_vsync ? SDL_RENDERER_PRESENTVSYNC : 0);
if(s_texture) SDL_DestroyTexture(s_texture);
s_texture = SDL_CreateTexture(srend, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, vid.xres, vid.yres);
if(s) SDL_FreeSurface(s);
s = shot::empty_surface(vid.xres, vid.yres, false);
#endif
s_screen = s;
#if CAP_GL
if(vid.usingGL) {
@ -1251,16 +1324,21 @@ EX void init_graph() {
get_canvas_size();
#else
if(!vid.xscr) {
#if CAP_SDL2
SDL_DisplayMode dm;
SDL_GetCurrentDisplayMode(0, &dm);
vid.xscr = vid.xres = dm.w;
vid.yscr = vid.yres = dm.h;
#else
const SDL_VideoInfo *inf = SDL_GetVideoInfo();
vid.xscr = vid.xres = inf->current_w;
vid.yscr = vid.yres = inf->current_h;
#endif
}
#endif
#ifdef CUSTOM_CAPTION
#if !CAP_SDL2
SDL_WM_SetCaption(CUSTOM_CAPTION, CUSTOM_CAPTION);
#else
SDL_WM_SetCaption("HyperRogue " VER, "HyperRogue " VER);
#endif
#endif
@ -1271,8 +1349,10 @@ EX void init_graph() {
exit(2);
}
#if !CAP_SDL2
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_EnableUNICODE(1);
#endif
#endif
#if ISANDROID

View File

@ -728,14 +728,22 @@ EX void mainloopiter() {
oldmousepan = mousepan;
#if CAP_MOUSEGRAB
if(mousepan) {
#if CAP_SDL2
SDL_SetRelativeMouseMode(SDL_TRUE);
#else
SDL_WM_GrabInput(SDL_GRAB_ON);
SDL_ShowCursor(SDL_DISABLE);
#endif
mouseaim_x = mouseaim_y = 0;
}
else {
#if CAP_SDL2
SDL_SetRelativeMouseMode(SDL_FALSE);
#else
SDL_WM_GrabInput( SDL_GRAB_OFF );
SDL_ShowCursor(SDL_ENABLE);
SDL_WarpMouse(vid.xres/2, vid.yres/2);
#endif
mouseaim_x = mouseaim_y = 0;
}
#endif
@ -769,6 +777,30 @@ EX void mainloopiter() {
lastframe = ticks;
}
wheelclick = false;
getcshift = 1;
#if CAP_SDL2
const Uint8 *keystate = SDL_GetKeyboardState(NULL);
pandora_rightclick = keystate[SDL_SCANCODE_RCTRL];
pandora_leftclick = keystate[SDL_SCANCODE_RSHIFT];
lshiftclick = keystate[SDL_SCANCODE_LSHIFT];
rshiftclick = keystate[SDL_SCANCODE_RSHIFT];
lctrlclick = keystate[SDL_SCANCODE_LCTRL];
rctrlclick = keystate[SDL_SCANCODE_RCTRL];
hiliteclick = keystate[SDL_SCANCODE_LALT] | keystate[SDL_SCANCODE_RALT];
if(keystate[SDL_SCANCODE_LSHIFT] || keystate[SDL_SCANCODE_RSHIFT]) getcshift = -1;
if(keystate[SDL_SCANCODE_LCTRL] || keystate[SDL_SCANCODE_RCTRL]) getcshift /= 10;
if(keystate[SDL_SCANCODE_LALT] || keystate[SDL_SCANCODE_RALT]) getcshift *= 10;
#else
Uint8 *keystate = SDL_GetKeyState(NULL);
pandora_rightclick = keystate[SDLK_RCTRL];
@ -776,21 +808,22 @@ EX void mainloopiter() {
lshiftclick = keystate[SDLK_LSHIFT];
rshiftclick = keystate[SDLK_RSHIFT];
anyshiftclick = lshiftclick | rshiftclick;
lctrlclick = keystate[SDLK_LCTRL];
rctrlclick = keystate[SDLK_RCTRL];
anyctrlclick = lctrlclick | rctrlclick;
forcetarget = anyshiftclick;
hiliteclick = keystate[SDLK_LALT] | keystate[SDLK_RALT];
wheelclick = false;
getcshift = 1;
hiliteclick = keystate[SDLK_LALT] | keystate[SDLK_RALT];
if(keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT]) getcshift = -1;
if(keystate[SDLK_LCTRL] || keystate[SDLK_RCTRL]) getcshift /= 10;
if(keystate[SDLK_LALT] || keystate[SDLK_RALT]) getcshift *= 10;
#endif
anyshiftclick = lshiftclick | rshiftclick;
anyctrlclick = lctrlclick | rctrlclick;
forcetarget = anyshiftclick;
didsomething = false;
if(vid.shifttarget&1) {
@ -858,6 +891,20 @@ EX void mainloopiter() {
auto& lastticks = sc_ticks;
ld t = (ticks - lastticks) * shiftmul / 1000.;
lastticks = ticks;
#if CAP_SDL2
const Uint8 *keystate = SDL_GetKeyboardState(NULL);
if(keystate[SDL_SCANCODE_END] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_END)) full_forward_camera(-t);
if(keystate[SDL_SCANCODE_HOME] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_HOME)) full_forward_camera(t);
if(keystate[SDL_SCANCODE_RIGHT] && DEFAULTNOR(SDL_SCANCODE_RIGHT)) full_rotate_camera(0, -t);
if(keystate[SDL_SCANCODE_LEFT] && DEFAULTNOR(SDL_SCANCODE_LEFT)) full_rotate_camera(0, t);
if(keystate[SDL_SCANCODE_UP] && DEFAULTNOR(SDL_SCANCODE_UP)) full_rotate_camera(1, t);
if(keystate[SDL_SCANCODE_DOWN] && DEFAULTNOR(SDL_SCANCODE_DOWN)) full_rotate_camera(1, -t);
if(keystate[SDL_SCANCODE_PAGEUP] && DEFAULTNOR(SDL_SCANCODE_PAGEUP)) full_rotate_view(t * 180 / M_PI, t);
if(keystate[SDL_SCANCODE_PAGEDOWN] && DEFAULTNOR(SDL_SCANCODE_PAGEDOWN)) full_rotate_view(-t * 180 / M_PI, t);
#else
Uint8 *keystate = SDL_GetKeyState(NULL);
if(keystate[SDLK_END] && GDIM == 3 && DEFAULTNOR(SDLK_END)) full_forward_camera(-t);
@ -868,6 +915,7 @@ EX void mainloopiter() {
if(keystate[SDLK_DOWN] && DEFAULTNOR(SDLK_DOWN)) full_rotate_camera(1, -t);
if(keystate[SDLK_PAGEUP] && DEFAULTNOR(SDLK_PAGEUP)) full_rotate_view(t * 180 / M_PI, t);
if(keystate[SDLK_PAGEDOWN] && DEFAULTNOR(SDLK_PAGEDOWN)) full_rotate_view(-t * 180 / M_PI, t);
#endif
}
else sc_ticks = ticks;
@ -905,6 +953,20 @@ EX void handle_event(SDL_Event& ev) {
initJoysticks();
} */
#if CAP_SDL2
if(ev.type == SDL_WINDOWEVENT) {
auto w = ev.window.event;
if(w == SDL_WINDOWEVENT_ENTER)
outoffocus = false;
if(w == SDL_WINDOWEVENT_LEAVE)
outoffocus = true;
if(w == SDL_WINDOWEVENT_EXPOSED)
drawscreen();
if(w == SDL_WINDOWEVENT_RESIZED)
resize_screen_to(ev.window.data1, ev.window.data2);
}
#else
if(ev.type == SDL_ACTIVEEVENT) {
if(ev.active.state & SDL_APPINPUTFOCUS) {
if(ev.active.gain) {
@ -917,11 +979,12 @@ EX void handle_event(SDL_Event& ev) {
}
if(ev.type == SDL_VIDEORESIZE)
resize_screen_to(ev.resize.w, ev.resize.h);
resize_screen_to(ev.resize.w, ev.resize.h);
if(ev.type == SDL_VIDEOEXPOSE) {
drawscreen();
}
#endif
#if CAP_SDLJOY
if(ev.type == SDL_JOYAXISMOTION && normal && DEFAULTCONTROL) {
@ -970,9 +1033,17 @@ EX void handle_event(SDL_Event& ev) {
flashMessages();
mousing = false;
sym = ev.key.keysym.sym;
#if CAP_SDL2
uni = ev.key.keysym.sym;
if(uni >= 'a' && uni <= 'z') {
if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) uni -= 32;
else if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) uni -= 96;
}
#else
uni = ev.key.keysym.unicode;
if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) shiftmul = -1;
if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) shiftmul /= 10;
#endif
numlock_on = ev.key.keysym.mod & KMOD_NUM;
if(sym == SDLK_RETURN && (ev.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) {
sym = 0; uni = 0;
@ -988,7 +1059,7 @@ EX void handle_event(SDL_Event& ev) {
bool rollchange = (cmode & sm::OVERVIEW) && getcstat >= 2000 && cheater;
if(ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP) {
if(ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP SDL12(, || ev.type == SDL_MOUSEWHEEL)) {
mousepressed = ev.type == SDL_MOUSEBUTTONDOWN;
if(mousepressed) flashMessages();
mousing = true;
@ -996,19 +1067,22 @@ EX void handle_event(SDL_Event& ev) {
bool was_holdmouse = holdmouse;
holdmouse = false;
bool down = ev.type == SDL_MOUSEBUTTONDOWN SDL12(, || ev.type == SDL_MOUSEWHEEL);
bool up = ev.type == SDL_MOUSEBUTTONUP;
bool act = false;
if(vid.quickmouse) {
act = ev.type == SDL_MOUSEBUTTONDOWN;
act = down;
}
else {
act = actonrelease && ev.type == SDL_MOUSEBUTTONUP;
actonrelease = ev.type == SDL_MOUSEBUTTONDOWN;
act = actonrelease && up;
actonrelease = down;
}
fix_mouseh();
if(was_holdmouse && ev.type == SDL_MOUSEBUTTONUP)
if(was_holdmouse && up)
sym = uni = PSEUDOKEY_RELEASE;
/* simulate RMB and MMB for Mac users etc. */
@ -1029,8 +1103,12 @@ EX void handle_event(SDL_Event& ev) {
sym = getcstat, uni = getcstat, shiftmul = getcshift;
}
else if(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP) {
else if(SDL12(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP, ev.type == SDL_MOUSEWHEEL)) {
#if CAP_SDL2
ld dir = ev.wheel.y * 0.25;
#else
ld dir = ev.button.button == SDL_BUTTON_WHEELUP ? 0.25 : -0.25;
#endif
if(lshiftclick && rshiftclick && !rug::rugged && GDIM == 2) {
mapeditor::scaleall(pow(2, dir), lctrlclick);
pconf.alpha *= pow(2, dir);

View File

@ -251,7 +251,14 @@ EX void glflush() {
#endif
#if CAP_SDL && !ISMOBILE
SDL_Surface *aux;
#if CAP_SDL2
SDL_Renderer *auxrend;
#else
#define auxrend aux
#endif
#endif
#if CAP_POLY
@ -552,17 +559,17 @@ void addpoly(const shiftmatrix& V, const vector<glvertex> &tab, int ofs, int cnt
}
#if CAP_SDLGFX
void aapolylineColor(SDL_Surface *s, int*x, int *y, int polyi, color_t col) {
void aapolylineColor(SDL_Renderer *s, int*x, int *y, int polyi, color_t col) {
for(int i=1; i<polyi; i++)
aalineColor(s, x[i-1], y[i-1], x[i], y[i], col);
}
void polylineColor(SDL_Surface *s, int *x, int *y, int polyi, color_t col) {
void polylineColor(SDL_Renderer *s, int *x, int *y, int polyi, color_t col) {
for(int i=1; i<polyi; i++)
lineColor(s, x[i-1], y[i-1], x[i], y[i], col);
}
EX void filledPolygonColorI(SDL_Surface *s, int* px, int *py, int polyi, color_t col) {
EX void filledPolygonColorI(SDL_Renderer *s, int* px, int *py, int polyi, color_t col) {
std::vector<Sint16> spx(px, px + polyi);
std::vector<Sint16> spy(py, py + polyi);
filledPolygonColor(s, spx.data(), spy.data(), polyi, col);
@ -1977,19 +1984,19 @@ void dqi_poly::draw() {
polyx[i] = 0; polyy[i] = vid.yres; i++;
polyx[i] = 0; polyy[i] = 0; i++;
}
filledPolygonColorI(s, polyx, polyy, polyi+5, color);
filledPolygonColorI(srend, polyx, polyy, polyi+5, color);
}
else if(poly_flags & POLY_TRIANGLES) {
for(int i=0; i<polyi; i+=3)
filledPolygonColorI(s, polyx+i, polyy+i, 3, color);
filledPolygonColorI(srend, polyx+i, polyy+i, 3, color);
}
else
filledPolygonColorI(s, polyx, polyy, polyi, color);
filledPolygonColorI(srend, polyx, polyy, polyi, color);
if(current_display->stereo_active()) filledPolygonColorI(aux, polyxr, polyy, polyi, color);
if(current_display->stereo_active()) filledPolygonColorI(auxrend, polyxr, polyy, polyi, color);
((vid.antialias & AA_NOGL) ?aapolylineColor:polylineColor)(s, polyx, polyy, polyi, outline);
if(current_display->stereo_active()) aapolylineColor(aux, polyxr, polyy, polyi, outline);
((vid.antialias & AA_NOGL) ?aapolylineColor:polylineColor)(srend, polyx, polyy, polyi, outline);
if(current_display->stereo_active()) aapolylineColor(auxrend, polyxr, polyy, polyi, outline);
if(vid.xres >= 2000 || fatborder) {
int xmi = 3000, xma = -3000;
@ -1997,7 +2004,7 @@ void dqi_poly::draw() {
if(xma > xmi + 20) for(int x=-1; x<2; x++) for(int y=-1; y<=2; y++) if(x*x+y*y == 1) {
for(int t=0; t<polyi; t++) polyx[t] += x, polyy[t] += y;
aapolylineColor(s, polyx, polyy, polyi, outline);
aapolylineColor(srend, polyx, polyy, polyi, outline);
for(int t=0; t<polyi; t++) polyx[t] -= x, polyy[t] -= y;
}
}
@ -2425,11 +2432,18 @@ EX void drawqueue() {
#if CAP_SDL
if(current_display->stereo_active() && !vid.usingGL) {
if(aux && (aux->w != s->w || aux->h != s->h))
if(aux && (aux->w != s->w || aux->h != s->h)) {
SDL_FreeSurface(aux);
#if CAP_SDL2
SDL_DestroyRenderer(auxrend);
#endif
}
if(!aux) {
aux = SDL_CreateRGBSurface(SDL_SWSURFACE,s->w,s->h,32,0,0,0,0);
#if CAP_SDL2
auxrend = SDL_CreateSoftwareRenderer(aux);
#endif
}
// SDL_LockSurface(aux);

View File

@ -4798,9 +4798,9 @@ EX void drawthemap() {
}
#if CAP_SDL
Uint8 *keystate = SDL_GetKeyState(NULL);
const Uint8 *keystate = SDL12_GetKeyState(NULL);
lmouseover = mouseover;
bool useRangedOrb = (!(vid.shifttarget & 1) && haveRangedOrb() && lmouseover && lmouseover->cpdist > 1) || (keystate[SDLK_RSHIFT] | keystate[SDLK_LSHIFT]);
bool useRangedOrb = (!(vid.shifttarget & 1) && haveRangedOrb() && lmouseover && lmouseover->cpdist > 1) || (keystate[SDL12(SDLK_RSHIFT, SDL_SCANCODE_RSHIFT)] | keystate[SDL12(SDLK_LSHIFT, SDL_SCANCODE_LSHIFT)]);
if(!useRangedOrb && !(cmode & sm::MAP) && !(cmode & sm::DRAW) && DEFAULTCONTROL && !mouseout() && !dual::state) {
dynamicval<eGravity> gs(gravity_state, gravity_state);
void calcMousedest();
@ -5291,13 +5291,8 @@ EX void drawscreen() {
#if CAP_VR
vrhr::submit();
#endif
#if CAP_SDL
#if CAP_GL
if(vid.usingGL) SDL_GL_SwapBuffers(); else
#endif
SDL_UpdateRect(s, 0, 0, vid.xres, vid.yres);
#endif
present_screen();
#if CAP_VR
vrhr::handoff();

View File

@ -108,31 +108,41 @@ namespace spiral {
displaystr(SX/2, vid.fsize*2, 0, vid.fsize, "arrows = navigate, ESC = return, h = hide help", forecolor, 8);
displaystr(SX/2, SY - vid.fsize*2, 0, vid.fsize, XLAT("s = save to " IMAGEEXT, buf), forecolor, 8);
}
SDL_UpdateRect(s, 0, 0, 0, 0);
present_surface();
shiftx += velx; shifty += vely;
SDL_Event event;
while(SDL_PollEvent(&event)) switch (event.type) {
#if !CAP_SDL2
case SDL_VIDEORESIZE: {
resize_screen_to(event.resize.w, event.resize.h);
precompute();
break;
}
#endif
#if CAP_SDL2
case SDL_WINDOWEVENT: {
if(event.window.event == SDL_WINDOWEVENT_RESIZED)
resize_screen_to(event.window.data1, event.window.data2);
precompute();
break;
}
#endif
case SDL_QUIT: case SDL_MOUSEBUTTONDOWN:
goto breakloop;
case SDL_KEYDOWN: {
int sym = event.key.keysym.sym;
int uni = event.key.keysym.unicode;
int uni = 0;
numlock_on = event.key.keysym.mod & KMOD_NUM;
if(DKEY == SDLK_RIGHT) velx++;
if(DKEY == SDLK_LEFT) velx--;
if(DKEY == SDLK_UP) vely++;
if(DKEY == SDLK_DOWN) vely--;
if(sym == SDLK_ESCAPE) goto breakloop;
if(uni == 'h') displayhelp = !displayhelp;
if(uni == 's') dosave = true;
if(sym == 'h') displayhelp = !displayhelp;
if(sym == 's') dosave = true;
}
}
}

View File

@ -167,7 +167,11 @@ string listkeys(int id) {
string lk = "";
for(int i=0; i<512; i++)
if(scfg.keyaction[i] == id)
#if CAP_SDL2
lk = lk + " " + SDL_GetScancodeName(SDL_Scancode(i));
#else
lk = lk + " " + SDL_GetKeyName(SDLKey(i));
#endif
#if CAP_SDLJOY
for(int i=0; i<numsticks; i++) for(int k=0; k<SDL_JoystickNumButtons(sticks[i]) && k<MAXBUTTON; k++)
if(scfg.joyaction[i][k] == id) {
@ -551,6 +555,43 @@ EX void initConfig() {
char* t = scfg.keyaction;
#if CAP_SDL2
t[SDL_SCANCODE_W] = 16 + 4;
t[SDL_SCANCODE_D] = 16 + 5;
t[SDL_SCANCODE_S] = 16 + 6;
t[SDL_SCANCODE_A] = 16 + 7;
t[SDL_SCANCODE_KP_8] = 16 + 4;
t[SDL_SCANCODE_KP_6] = 16 + 5;
t[SDL_SCANCODE_KP_2] = 16 + 6;
t[SDL_SCANCODE_KP_4] = 16 + 7;
t[SDL_SCANCODE_F] = 16 + pcFire;
t[SDL_SCANCODE_G] = 16 + pcFace;
t[SDL_SCANCODE_H] = 16 + pcFaceFire;
t[SDL_SCANCODE_R] = 16 + pcDrop;
t[SDL_SCANCODE_T] = 16 + pcOrbPower;
t[SDL_SCANCODE_Y] = 16 + pcCenter;
t[SDL_SCANCODE_I] = 32 + 4;
t[SDL_SCANCODE_L] = 32 + 5;
t[SDL_SCANCODE_K] = 32 + 6;
t[SDL_SCANCODE_J] = 32 + 7;
t[SDL_SCANCODE_SEMICOLON] = 32 + 8;
t[SDL_SCANCODE_APOSTROPHE] = 32 + 9;
t[SDL_SCANCODE_P] = 32 + 10;
t[SDL_SCANCODE_LEFTBRACKET] = 32 + pcCenter;
t[SDL_SCANCODE_UP] = 48 ;
t[SDL_SCANCODE_RIGHT] = 48 + 1;
t[SDL_SCANCODE_DOWN] = 48 + 2;
t[SDL_SCANCODE_LEFT] = 48 + 3;
t[SDL_SCANCODE_PAGEUP] = 48 + 4;
t[SDL_SCANCODE_PAGEDOWN] = 48 + 5;
t[SDL_SCANCODE_HOME] = 48 + 6;
#else
t[(int)'w'] = 16 + 4;
t[(int)'d'] = 16 + 5;
t[(int)'s'] = 16 + 6;
@ -588,6 +629,7 @@ EX void initConfig() {
t[SDLK_PAGEDOWN] = 48 + 5;
t[SDLK_HOME] = 48 + 6;
#endif
#endif
scfg.joyaction[0][0] = 16 + pcFire;
scfg.joyaction[0][1] = 16 + pcOrbPower;
@ -671,7 +713,7 @@ EX void handleInput(int delta) {
#if CAP_SDL
double d = delta / 500.;
Uint8 *keystate = SDL_GetKeyState(NULL);
const Uint8 *keystate = SDL12_GetKeyState(NULL);
for(int i=0; i<NUMACT; i++)
lactionpressed[i] = actionspressed[i],
@ -679,7 +721,7 @@ EX void handleInput(int delta) {
for(int i=0; i<SHMUPAXES; i++) axespressed[i] = 0;
for(int i=0; i<SDLK_LAST; i++) if(keystate[i])
for(int i=0; i<KEYSTATES; i++) if(keystate[i])
pressaction(scfg.keyaction[i]);
#if CAP_SDLJOY

View File

@ -34,12 +34,28 @@ string libs;
int batch_size = thread::hardware_concurrency() + 1;
bool mingw64 = false;
int sdlver = 2;
#if defined(MAC)
string os = "mac";
#elif defined(WINDOWS)
string os = "mingw64";
#else
string os = "linux";
#endif
void set_linux() {
preprocessor = "g++ -E";
compiler = "g++ -Wall -Wextra -Wno-maybe-uninitialized -Wno-unused-parameter -Wno-implicit-fallthrough -rdynamic -fdiagnostics-color=always -c";
linker = "g++ -rdynamic -o hyper";
opts = "-DFHS -DLINUX -I/usr/include/SDL";
libs = " savepng.o -lSDL -lSDL_ttf -lSDL_mixer -lSDL_gfx -lGLEW -lGL -lpng -rdynamic -lpthread -lz";
if(sdlver == 2) {
opts = "-DFHS -DLINUX -I/usr/include/SDL2";
libs = " savepng.o -lSDL2 -lSDL2_ttf -lSDL2_mixer -lSDL2_gfx -lGLEW -lGL -lpng -rdynamic -lpthread -lz";
}
else {
opts = "-DFHS -DLINUX -I/usr/include/SDL";
libs = " savepng.o -lSDL -lSDL_ttf -lSDL_mixer -lSDL_gfx -lGLEW -lGL -lpng -rdynamic -lpthread -lz";
}
}
void set_mac() {
@ -73,6 +89,18 @@ void set_web() {
libs = "";
}
void set_os(string o) {
os = o;
if(os == "linux") set_linux();
else if(os == "mac") set_mac();
else if(os == "mingw64") set_mingw64();
else if(os == "web") set_web();
else {
fprintf(stderr, "unknown OS");
exit(1);
}
}
vector<string> modules;
time_t get_file_time(const string s) {
@ -97,13 +125,7 @@ bool file_exists(string fname) {
}
int main(int argc, char **argv) {
#if defined(MAC)
set_mac();
#elif defined(WINDOWS)
set_mingw64();
#else
set_linux();
#endif
set_os(os);
int retval = 0; // for storing return values of some function calls
for(string fname: {"Makefile.loc", "Makefile.simple", "Makefile"})
if(file_exists(fname)) {
@ -122,26 +144,40 @@ int main(int argc, char **argv) {
else obj_dir += c;
}
else if(s == "-mingw64") {
set_mingw64();
set_os("mingw64");
obj_dir += "/mingw64";
setdir += "../";
}
else if(s == "-mac") {
set_mac();
set_os("mac");
obj_dir += "/mac";
setdir += "../";
}
else if(s == "-linux") {
set_linux();
set_os("linux");
obj_dir += "/linux";
setdir += "../";
}
else if(s == "-web") {
set_web();
set_os("web");
modules.push_back("hyperweb");
obj_dir += "/web";
setdir += "../";
}
else if(s == "-sdl1") {
sdlver = 1;
set_os(os);
obj_dir += "/sdl1";
setdir += "../";
opts += " -DCAP_SDL2=0";
}
else if(s == "-sdl2") {
sdlver = 2;
set_os(os);
obj_dir += "/sdl2";
setdir += "../";
opts += " -DCAP_SDL2=1";
}
else if(s.substr(0, 2) == "-f") {
opts += " " + s;
obj_dir += "/";

View File

@ -208,7 +208,7 @@ EX namespace netgen {
void blackline(vec v1, vec v2, color_t col = 0x000000FF) {
#if CAP_SDLGFX
aalineColor(s, int(v1.x), int(v1.y), int(v2.x), int(v2.y), col);
aalineColor(srend, int(v1.x), int(v1.y), int(v2.x), int(v2.y), col);
#elif CAP_SDL
SDL_LockSurface(s);
int len = abs(v1.x-v2.x) + abs(v1.y-v2.y);
@ -226,7 +226,7 @@ EX namespace netgen {
polyy[0] = int(v1.y);
polyy[1] = int(v2.y);
polyy[2] = int(v3.y);
filledPolygonColorI(s, polyx, polyy, 3, col);
filledPolygonColorI(srend, polyx, polyy, 3, col);
#elif CAP_SDL
SDL_LockSurface(s);
int len = abs(v1.x-v2.x) + abs(v1.y-v2.y);
@ -238,7 +238,7 @@ EX namespace netgen {
void blackcircle(vec v, int r, color_t col = 0x000000FF) {
#if CAP_SDLGFX
aacircleColor(s, int(v.x), int(v.y), r, col);
aacircleColor(srend, int(v.x), int(v.y), r, col);
#endif
}
@ -338,9 +338,14 @@ EX namespace netgen {
drawline(hvec(i,e), hvec(i,7), 0x80808080);
} */
SDL_Surface *sav = s;
dynamicval<SDL_Surface*> ds(s);
s = net = SDL_CreateRGBSurface(SDL_SWSURFACE,SX*nscale,SY*nscale,32,0,0,0,0);
#if CAP_SDL2
dynamicval<SDL_Renderer*> dr(srend);
srend = SDL_CreateSoftwareRenderer(s);
#endif
SDL_FillRect(net, NULL, 0xFFFFFF);
int pateks = 0;
@ -440,8 +445,9 @@ EX namespace netgen {
SDL_FreeSurface(net);
SDL_FreeSurface(quarter);
s = sav;
#if CAP_SDL2
SDL_DestroyRenderer(srend);
#endif
}
vec mousepos, rel;
@ -554,7 +560,8 @@ EX namespace netgen {
}
SDL_UnlockSurface(s);
SDL_UpdateRect(s, 0, 0, 0, 0);
present_surface();
}
double rs, rz;
@ -609,9 +616,13 @@ EX namespace netgen {
break;
}
case SDL_KEYDOWN: {
case SDL_KEYDOWN: {
int key = event.key.keysym.sym;
#if CAP_SDL2
int uni = key;
#else
int uni = event.key.keysym.unicode;
#endif
if(uni == 'q' || key == SDLK_ESCAPE || key == SDLK_F10)
return;
@ -636,7 +647,10 @@ EX namespace netgen {
}
void designNet() {
#if !CAP_SDL2
// fstx
s = SDL_SetVideoMode(SX, SY, 32, 0);
#endif
netgen_loop();
saveData();
setvideomode();

20
rug.cpp
View File

@ -1333,20 +1333,20 @@ EX void actDraw() {
lastticks = ticks;
#if CAP_HOLDKEYS
Uint8 *keystate = SDL_GetKeyState(NULL);
if(keystate[SDLK_LALT]) alpha /= 10;
const Uint8 *keystate = SDL12_GetKeyState(NULL);
if(keystate[SDL12(SDLK_LALT, SDL_SCANCODE_LALT)]) alpha /= 10;
#endif
#if CAP_HOLDKEYS
auto perform_finger = [=] () {
if(keystate[SDLK_HOME]) finger_range /= exp(alpha);
if(keystate[SDLK_END]) finger_range *= exp(alpha);
if(keystate[SDLK_LEFT]) finger_on(0, -alpha);
if(keystate[SDLK_RIGHT]) finger_on(0, alpha);
if(keystate[SDLK_UP]) finger_on(1, alpha);
if(keystate[SDLK_DOWN]) finger_on(1, -alpha);
if(keystate[SDLK_PAGEDOWN]) finger_on(2, -alpha);
if(keystate[SDLK_PAGEUP]) finger_on(2, +alpha);
if(keystate[SDL12(SDLK_HOME, SDL_SCANCODE_HOME)]) finger_range /= exp(alpha);
if(keystate[SDL12(SDLK_END, SDL_SCANCODE_END)]) finger_range *= exp(alpha);
if(keystate[SDL12(SDLK_LEFT, SDL_SCANCODE_LEFT)]) finger_on(0, -alpha);
if(keystate[SDL12(SDLK_RIGHT, SDL_SCANCODE_RIGHT)]) finger_on(0, alpha);
if(keystate[SDL12(SDLK_UP, SDL_SCANCODE_UP)]) finger_on(1, alpha);
if(keystate[SDL12(SDLK_DOWN, SDL_SCANCODE_DOWN)]) finger_on(1, -alpha);
if(keystate[SDL12(SDLK_PAGEDOWN, SDL_SCANCODE_PAGEDOWN)]) finger_on(2, -alpha);
if(keystate[SDL12(SDLK_PAGEUP, SDL_SCANCODE_PAGEUP)]) finger_on(2, +alpha);
};
if(finger_center)

View File

@ -876,8 +876,12 @@ void movePlayer(monster *m, int delta) {
}
#if CAP_SDL
Uint8 *keystate = SDL_GetKeyState(NULL);
const Uint8 *keystate = SDL12_GetKeyState(NULL);
#if CAP_SDL2
bool forcetarget = (keystate[SDL_SCANCODE_RSHIFT] | keystate[SDL_SCANCODE_LSHIFT]);
#else
bool forcetarget = (keystate[SDLK_RSHIFT] | keystate[SDLK_LSHIFT]);
#endif
if(((mousepressed && !forcetarget) || facemouse) && delta > 0 && !mouseout() && !stdracing && GDIM == 2) {
// playermoved = true;
hyperpoint h = inverse_shift(m->pat, mouseh);

View File

@ -121,6 +121,10 @@
#define CAP_SDL (!ISMOBILE)
#endif
#ifndef CAP_SDL2
#define CAP_SDL2 1
#endif
#ifndef CAP_COMPASS
#define CAP_COMPASS ISMOBILE
#endif
@ -340,23 +344,55 @@
#include <stdio.h>
#if CAP_SDL
#if CAP_SDL2
#include <SDL2/SDL.h>
#define SDL12(x,y) y
#define SDLK_KP1 SDLK_KP_1
#define SDLK_KP2 SDLK_KP_2
#define SDLK_KP3 SDLK_KP_3
#define SDLK_KP4 SDLK_KP_4
#define SDLK_KP5 SDLK_KP_5
#define SDLK_KP6 SDLK_KP_6
#define SDLK_KP7 SDLK_KP_7
#define SDLK_KP8 SDLK_KP_8
#define SDLK_KP9 SDLK_KP_9
#define SDLK_KP0 SDLK_KP_0
#define SDL12_GetKeyState SDL_GetKeyboardState
#define KEYSTATES SDL_NUM_SCANCODES
#else
#include <SDL/SDL.h>
#define SDL12(x,y) x
#define SDL12_GetKeyState SDL_GetKeyState
#define KEYSTATES SDLK_LAST
#endif
#if !ISMAC
#undef main
#endif
#if CAP_SDLAUDIO
#if CAP_SDL2
#include <SDL2/SDL_mixer.h>
#else
#include <SDL/SDL_mixer.h>
#endif
#endif
#if CAP_SDLTTF
#if CAP_SDL2
#include <SDL2/SDL_ttf.h>
#else
#include <SDL/SDL_ttf.h>
#endif
#endif
#if CAP_SDLGFX
#if CAP_SDL2
#include <SDL2/SDL2_gfxPrimitives.h>
#else
#include <SDL/SDL_gfxPrimitives.h>
#endif
#endif
#elif !ISFAKEMOBILE
#define SDLK_F1 (123001)

View File

@ -155,7 +155,7 @@ SDL_Surface *convertSurface(SDL_Surface* s) {
fmt.Aloss = fmt.Rloss = fmt.Gloss = fmt.Bloss = 0;
fmt.palette = NULL;
#ifndef SDL2
#if !CAP_SDL2
fmt.alpha = 0;
fmt.colorkey = 0x1ffffff;
#endif