hyperrogue/mobile.cpp

405 lines
10 KiB
C++
Raw Permalink Normal View History

// Hyperbolic Rogue -- initialization, and stuff related to mobiles
// Copyright (C) 2011-2018 Zeno Rogue, see 'hyper.cpp' for details
/** \file init.cpp
* \brief initialization, and stuff related to mobiles
*/
#include "hyper.h"
namespace hr {
2017-07-22 23:33:27 +00:00
#if ISANDROID
2017-03-23 10:53:57 +00:00
string buildScoreDescription() {
string s;
time_t timer;
timer = time(NULL);
char buf[128]; strftime(buf, 128, "%c", localtime(&timer));
s += XLAT("HyperRogue for Android");
2017-07-22 23:33:27 +00:00
s += " ( " VER "), http://www.roguetemple.com/z/hyper/\n";
2017-10-17 18:36:36 +00:00
s += XLAT("Date: %1 time: %2 s ", buf, getgametime_s());
s += XLAT("distance: %1\n", its(celldist(cwt.at)));
2017-03-23 10:53:57 +00:00
if(cheater) s += XLAT("Cheats: ") + its(cheater) + "\n";
s += XLAT("Score: ") + its(gold());
for(int i=0; i<ittypes; i++) if(items[i]) {
string t = XLATN(iinf[i].name);
s += hr::format(" %s (%d)", t.c_str(), items[i]);
2017-03-23 10:53:57 +00:00
}
s += "\n";
s += XLAT("Kills: ") + its(tkills());
for(int i=1; i<motypes; i++) if(kills[i]) {
string t = XLATN(minf[i].name);
s += hr::format(" %s (%d)", t.c_str(), kills[i]);
2017-03-23 10:53:57 +00:00
}
s += "\n";
for(int i=0; i<gamelog.size(); i++) if(gamelog[i].msg != "") s += gamelog[i].msg + "\n";
return s;
}
#endif
#if ISMOBILE
2017-03-23 10:53:57 +00:00
int andmode;
2020-04-06 06:37:22 +00:00
bool lclicked = false;
EX bool clicked = false;
EX bool buttonclicked = false;
2017-03-23 10:53:57 +00:00
string lmouseovers;
bool inmenu = false;
bool wclick;
2017-03-23 10:53:57 +00:00
bool longclick;
bool verylongclick;
2017-03-23 10:53:57 +00:00
void handleScoreClick();
void openURL();
void displayTexts();
void controlMusic(int ticks);
void showHelp(MOBPAR_FORMAL, string nhelp) {
2017-07-22 23:33:27 +00:00
gotoHelp(nhelp);
2017-03-23 10:53:57 +00:00
}
bool useRangedOrb;
void handleclick(MOBPAR_FORMAL) {
if(handleCompass()) return;
2017-03-23 10:53:57 +00:00
2017-06-09 01:41:33 +00:00
if(buttonclicked || mouseout()) {
2018-06-22 12:47:24 +00:00
bool statkeys = andmode == 0 && !shmup::on && isize(screens) == 1;
2017-03-23 10:53:57 +00:00
if(statkeys && getcstat == 'g') {
2017-03-23 10:53:57 +00:00
movepcto(MD_DROP);
getcstat = 0;
}
else if(statkeys && getcstat == 'i') {
if(inv::on) pushScreen(inv::show);
getcstat = 0;
}
else if(statkeys && getcstat == 't') {
if(playermoved && items[itStrongWind]) {
cell *c = whirlwind::jumpDestination(cwt.at);
2020-04-06 06:37:22 +00:00
if(c) centerover = c;
}
2020-04-06 06:37:22 +00:00
targetRangedOrb(centerover, roKeyboard);
getcstat = 0;
}
2023-12-30 07:10:52 +00:00
else if(statkeys && getcstat == 'f') {
bow::switch_fire_mode();
getcstat = 0;
}
else if(getcstat != SDLK_F1 && getcstat != 'i' && getcstat != 't') {
int px = mousex < current_display->xcenter ? 0 : 1;
int py = mousey < current_display->ycenter ? 0 : 1;
2017-03-23 10:53:57 +00:00
2018-06-22 12:47:24 +00:00
if(isize(screens) == 1) {
2017-03-23 10:53:57 +00:00
if(px == 0 && py == 1) {
if(andmode == 0 && shmup::on) ;
else andmode = 10;
}
if(px == 1 && py == 1) {
if(andmode == 0 && shmup::on) ; // just fire, do not change modes
else {
if(andmode == 1) {
ors::reset();
2017-03-23 10:53:57 +00:00
centerpc(INF);
View = Id;
2020-04-06 06:37:22 +00:00
centerover = cwt.at;
2017-03-23 10:53:57 +00:00
}
andmode = 11;
}
}
if(px == 0 && py == 0) andmode = 22;
if(px == 1 && py == 0) andmode = 13;
}
}
else {
if(andmode == 0 && help != "@") {
addMessage(mouseovers);
showHelp(MOBPAR_ACTUAL, help);
andmode = 10;
getcstat = 0;
return;
}
}
}
2018-06-22 12:47:24 +00:00
if(andmode == 0 && isize(screens) == 1 && !mouseout()) {
2017-03-23 10:53:57 +00:00
bool forcetarget = longclick;
if(mouseover && targetclick && targetRangedOrb(mouseover, forcetarget ? roMouseForce : roMouse)) {
;
}
else if(!forcetarget) {
if(WDIM == 3 && wclick) movepcto(-1);
2019-08-15 13:05:43 +00:00
else if(GDIM == 3) mousemovement();
else movepcto(mousedest);
}
2017-03-23 10:53:57 +00:00
}
if(andmode == 10) {
if(!playerfound) {
centerpc(INF);
View = Id;
2020-04-06 06:37:22 +00:00
centerover = cwt.at;
2017-03-23 10:53:57 +00:00
}
playermoved = true;
}
if(andmode >= 10) andmode -= 10;
2017-08-06 12:50:16 +00:00
if(andmode == 3) {
2022-07-12 11:19:25 +00:00
pushScreen(showGameMenu);
2017-08-06 12:50:16 +00:00
andmode = 0;
}
2017-03-23 10:53:57 +00:00
}
int touchedAt;
2017-07-22 23:33:27 +00:00
#if CAP_ANDROIDSHARE
2017-03-31 19:41:09 +00:00
void shareScore(MOBPAR_FORMAL);
#endif
#if CAP_ORIENTATION
int first_check, last_check;
transmatrix main_last_orientation;
void apply_orientation() {
if(ticks > last_check + 2000) first_check = ticks;
last_check = ticks;
transmatrix T = MirrorX * hr::getOrientation() * MirrorX;
if(ticks < first_check + 500)
main_last_orientation = T;
else {
transmatrix next_orientation = T;
rotate_view(main_last_orientation);
if(WDIM == 2 && vid.fixed_yz) {
if(View[0][2] || View[1][2] || View[2][2]) {
View = cspin(0, 2, -atan2(View[0][2], View[2][2])) * View;
View = cspin(1, 2, -atan2(View[1][2], View[2][2])) * View;
}
}
rotate_view(inverse(next_orientation));
main_last_orientation = next_orientation;
}
}
#endif
2020-04-06 06:37:22 +00:00
EX void mobile_draw(MOBPAR_FORMAL) {
2017-03-23 10:53:57 +00:00
apply_memory_reserve();
2017-03-23 10:53:57 +00:00
optimizeview();
int lastt = ticks; ticks = SDL_GetTicks();
2017-03-23 10:53:57 +00:00
if(lastt > ticks) lastt = ticks;
int tdiff = ticks - lastt;
ors::check_orientation();
2019-08-15 13:05:43 +00:00
if(GDIM == 3 && !shmup::on && !rug::rugged)
apply_orientation();
if(rug::rugged) {
rug::using_rugview urv;
apply_orientation();
}
2017-03-23 10:53:57 +00:00
if(playermoved && vid.sspeed > -4.99)
centerpc(tdiff / 1000.0 * exp(vid.sspeed));
2018-06-22 12:47:24 +00:00
if(shmup::on && (andmode == 0 || andmode == 10) && isize(screens) == 1)
2017-03-23 10:53:57 +00:00
shmup::turn(tdiff);
safety = false;
vid.fsize = (min(vid.xres, vid.yres) * vid.fontscale + 50) / 3200;
2017-03-23 10:53:57 +00:00
2017-06-09 01:41:33 +00:00
mouseoh = mouseh;
2017-03-23 10:53:57 +00:00
gtouched = mousepressed = clicked;
wclick = lclicked && ticks > touchedAt + 250;
2017-03-23 10:53:57 +00:00
longclick = lclicked && ticks > touchedAt + 500;
verylongclick = longclick && ticks > touchedAt + 1000;
2017-03-23 10:53:57 +00:00
useRangedOrb =
longclick || (!(vid.shifttarget & 2) && haveRangedOrb() && lmouseover && lmouseover->cpdist > 1);
targetclick = ((vid.shifttarget & 2) && !shmup::on) ? longclick : true;
if(shmup::on) {
using namespace shmupballs;
if(hypot(mousex - xfire, mousey - yb) < rad) targetclick = false;
if(hypot(mousex - xmove, mousey - yb) < rad) targetclick = false;
}
2017-07-22 23:33:27 +00:00
if(cmode & sm::NORMAL) {
2021-06-01 16:01:21 +00:00
lmouseover_distant = mouseover;
2017-03-23 10:53:57 +00:00
lmouseover = (gtouched && lclicked) ? mouseover : NULL;
if(!shmup::on && !useRangedOrb && vid.mobilecompasssize) {
using namespace shmupballs;
int dx = mousex - xmove;
int dy = mousey - yb;
int h = hypot(dx, dy);
if(h < rad) {
if(h < rad*SKIPFAC) { lmouseover = cwt.at; mousedest.d = -1; }
2017-03-23 10:53:57 +00:00
else {
2017-07-10 18:47:38 +00:00
double d = vid.revcontrol ? -1 : 1;
mouseh = shiftless(hpxy(dx * d / rad, dy * d / rad));
2017-03-23 10:53:57 +00:00
calcMousedest();
}
}
}
if(andmode == 0 && !useRangedOrb && gtouched && lclicked) {
lmouseover = mousedest.d >= 0 ? cwt.at->modmove(cwt.spin + mousedest.d) : cwt.at;
2017-03-23 10:53:57 +00:00
}
}
2018-02-11 01:19:49 +00:00
#if CAP_RUG
if(rug::rugged)
mouseh = rug::gethyper(mousex, mousey);
else
#endif
mouseh = gethyper(mousex, mousey);
2017-03-23 10:53:57 +00:00
inmenu = isize(screens) > 1;
if(!inmenu && vid.stereo_mode == sLR && ors::mode)
mousex = vid.xres/2, mousey = vid.yres/2, mouseh = shiftless(sphereflip * C0);
2017-03-23 10:53:57 +00:00
frames++;
models::configure();
2018-10-23 14:58:19 +00:00
2017-03-23 10:53:57 +00:00
if(ticks > lastt) tortoise::updateVals(ticks - lastt);
if(clicked && !lclicked) touchedAt = ticks;
2017-07-22 23:33:27 +00:00
#if CAP_XGD
2017-03-23 10:53:57 +00:00
graphdata.clear();
2017-07-22 23:33:27 +00:00
#endif
2017-03-23 10:53:57 +00:00
getcstat = 0; shiftmul = 1; getcshift = 1;
drawscreen();
shiftmul = getcshift;
calcMousedest();
if(lclicked && !clicked && !inmenu) handleclick(MOBPAR_ACTUAL);
if(inmenu && !clicked && !lclicked) inmenu = false;
2023-12-30 07:10:52 +00:00
if(!clicked && !lclicked) invslider = false;
2017-03-23 10:53:57 +00:00
bool keyreact = lclicked && !clicked;
#if CAP_MENUSCALING
if(true) {
2017-03-23 10:53:57 +00:00
using namespace dialog::zoom;
if(zoomoff || !(cmode & sm::ZOOMABLE)) nozoom();
else if(clicked && !lclicked) initzoom();
else if(!clicked && zoomf > 1) stopzoom();
}
#endif
2017-03-23 10:53:57 +00:00
if(inslider) keyreact = true;
2023-12-30 07:10:52 +00:00
if(invslider || getcstat == PSEUDOKEY_LIST_SLIDER) keyreact = true;
2017-03-23 10:53:57 +00:00
2017-07-22 23:33:27 +00:00
#if CAP_ANDROIDSHARE
2017-03-31 19:41:09 +00:00
if(getcstat == 's'-96 && keyreact) {
2017-07-22 23:33:27 +00:00
popScreenAll();
2017-03-23 10:53:57 +00:00
shareScore(MOBPAR_ACTUAL);
}
#endif
bool normal_reaction = !inmenu;
if(normal_reaction && vid.stereo_mode == sLR) {
normal_reaction = false;
if(lclicked && !clicked) {
if(rug::rugged)
rug::select();
2019-08-15 13:05:43 +00:00
else if((ors::mode || GDIM == 3) && !verylongclick)
normal_reaction = true;
else
pushScreen(showStereo);
}
}
2018-06-22 12:47:24 +00:00
if(andmode == 2 && isize(screens) != 1) andmode = 12;
2017-03-23 10:53:57 +00:00
2017-07-22 23:33:27 +00:00
if((cmode & sm::NORMAL) && getcstat == '-')
getcstat = 0;
if(keyreact) {
handlekey(getcstat, getcstat);
2017-03-23 10:53:57 +00:00
}
2017-07-22 23:33:27 +00:00
#if ISIOS
2017-03-23 10:53:57 +00:00
displayTexts();
#endif
static int lticks_rug;
if(clicked && lclicked && andmode == 1 && normal_reaction) {
2019-08-15 13:05:43 +00:00
if(GDIM == 3 && !rug::rugged) {
View = cpush(2, -(ticks - lticks_rug) / 2500.) * View;
playermoved = false;
}
else if(!mouseout2() && mouseoh[2] < 50 && mouseh[2] < 50 && !rug::rugged) {
2017-07-22 23:33:27 +00:00
panning(mouseoh, mouseh);
2017-03-23 10:53:57 +00:00
}
2017-07-22 23:33:27 +00:00
}
2018-02-03 19:04:19 +00:00
#if CAP_RUG && CAP_ANIMATIONS
if(andmode == 1 && normal_reaction && rug::rugged && clicked && rug::move_on_touch)
anims::animate_rug_movement(rug::move_on_touch * (ticks - lticks_rug) / 2500.);
2018-02-04 00:04:29 +00:00
#endif
2018-02-03 19:04:19 +00:00
lticks_rug = ticks;
2017-03-23 10:53:57 +00:00
if(andmode == 1 && lclicked && !clicked && normal_reaction && mouseover)
2020-04-06 06:37:22 +00:00
mine::performMarkCommand(mouseover);
2017-03-23 10:53:57 +00:00
if(clicked && andmode == 2 && (mouseover != lmouseover || mouseovers != lmouseovers) && normal_reaction) {
2017-07-22 23:33:27 +00:00
addMessage(mouseovers);
lmouseovers = mouseovers;
}
if(andmode == 10 && clicked != lclicked) andmode = 0;
if(andmode == 20 && clicked != lclicked) andmode = 10;
if(andmode == 2 && lclicked && !clicked) {
showHelp(MOBPAR_ACTUAL, help);
}
2017-03-23 10:53:57 +00:00
else if(andmode == 4) {
achievement_final(false);
}
if(clicked && andmode == 12 && (mouseover != lmouseover || mouseovers != lmouseovers)) {
2017-03-23 10:53:57 +00:00
addMessage(mouseovers);
lmouseovers = mouseovers;
}
if(clicked != lclicked)
flashMessages();
// END
lclicked = clicked;
2017-07-22 23:33:27 +00:00
#if ISIOS
2017-03-23 10:53:57 +00:00
controlMusic(ticks - lastt);
#endif
}
#endif
}