1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-24 13:27:17 +00:00
hyperrogue/init.cpp

463 lines
11 KiB
C++
Raw 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
*/
2017-10-29 13:19:51 +00:00
#include "compileunits.h"
2017-10-29 11:46:57 +00:00
namespace hr {
2017-10-29 13:19:51 +00:00
#if CU_INIT
2019-08-09 19:00:52 +00:00
EX int fontscale = 100;
2017-10-29 11:46:57 +00:00
2019-08-09 19:00:52 +00:00
EX int debugflags = DF_INIT | DF_ERROR | DF_WARN | DF_MSG | DF_TIME | DF_LOG;
2017-03-23 10:53:57 +00:00
2019-08-09 20:07:03 +00:00
EX string s0;
2017-03-23 10:53:57 +00:00
2019-08-09 19:00:52 +00:00
EX bool fixseed = false;
EX int startseed = 0;
2017-03-23 10:53:57 +00:00
2019-08-09 21:39:36 +00:00
EX eLand firstland0;
2019-08-09 19:00:52 +00:00
EX void initAll() {
2018-11-08 20:56:06 +00:00
init_floorcolors();
2017-08-06 12:50:16 +00:00
showstartmenu = true;
2017-03-23 10:53:57 +00:00
ca::init();
#if CAP_COMMANDLINE
2017-03-23 10:53:57 +00:00
arg::read(1);
#endif
2017-03-23 10:53:57 +00:00
srand(time(NULL));
2017-07-16 21:00:55 +00:00
shrand(fixseed ? startseed : time(NULL));
2017-03-23 10:53:57 +00:00
achievement_init(); // not in ANDROID
firstland0 = firstland;
2017-03-23 10:53:57 +00:00
// initlanguage();
initgraph();
2017-07-22 23:33:27 +00:00
#if CAP_SAVE
2017-03-23 10:53:57 +00:00
loadsave();
if(IRREGULAR) irr::auto_creator();
2017-03-23 10:53:57 +00:00
#endif
start_game();
2017-03-23 10:53:57 +00:00
if(!shmup::on) {
restoreGolems(items[itOrbLife], moGolem); items[itOrbLife] = 0;
restoreGolems(items[itOrbFriend], moTameBomberbird); items[itOrbFriend] = 0;
restoreGolems(kills[moPrincessMoved], moPrincess, princess::saveHP); kills[moPrincessMoved] = 0;
restoreGolems(kills[moPrincessArmedMoved], moPrincessArmed, princess::saveArmedHP); kills[moPrincessArmedMoved] = 0;
}
firstland = firstland0;
polygonal::solve();
2017-03-23 10:53:57 +00:00
}
2019-08-09 19:00:52 +00:00
EX void finishAll() {
2017-03-23 10:53:57 +00:00
achievement_final(!items[itOrbSafety]);
2017-07-22 23:33:27 +00:00
#if CAP_SAVE
2017-03-23 10:53:57 +00:00
saveStats();
#endif
offscreen.clear();
clearMemory();
2017-07-22 23:33:27 +00:00
#if ISMOBILE==0
2017-03-23 10:53:57 +00:00
cleargraph();
#endif
achievement_close();
}
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));
char buf2[128];
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
// s += buf2;
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);
sprintf(buf2, " %s (%d)", t.c_str(), items[i]);
s += buf2;
}
s += "\n";
s += XLAT("Kills: ") + its(tkills());
for(int i=1; i<motypes; i++) if(kills[i]) {
string t = XLATN(minf[i].name);
sprintf(buf2, " %s (%d)", t.c_str(), kills[i]);
s += buf2;
}
s += "\n";
for(int i=0; i<gamelog.size(); i++) if(gamelog[i].msg != "") s += gamelog[i].msg + "\n";
return s;
}
#endif
2017-07-22 23:33:27 +00:00
#if ISMOBILE==1
2017-03-23 10:53:57 +00:00
int andmode;
2017-03-23 10:53:57 +00:00
bool lclicked = false, clicked = false;
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);
2018-08-24 22:01:46 +00:00
if(c) centerover.at = c, centerover.spin = 0;
}
2018-08-24 22:01:46 +00:00
targetRangedOrb(centerover.at, roKeyboard);
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;
2018-08-24 22:01:46 +00:00
viewctr.at = cwt.at->master;
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;
2018-08-24 22:01:46 +00:00
viewctr.at = cwt.at->master;
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) {
if(tour::on)
showMissionScreen();
else
pushScreen(showMainMenu);
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;
View = main_last_orientation * View;
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;
}
}
View = inverse(next_orientation) * View;
main_last_orientation = next_orientation;
}
}
#endif
2017-03-23 10:53:57 +00:00
void mobile_draw(MOBPAR_FORMAL) {
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();
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) * fontscale + 50) / 3200;
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) {
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;
2017-03-23 10:53:57 +00:00
mouseh = hpxy(dx * d / rad, dy * d / rad);
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 = 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;
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;
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
2018-02-04 00:04:29 +00:00
#if CAP_RUG
if(andmode == 1 && normal_reaction && rug::rugged && clicked)
2018-02-04 00:04:29 +00:00
rug::move_forward((ticks - lticks_rug) / 2500.);
#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)
2017-07-22 23:33:27 +00:00
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
2017-07-22 23:33:27 +00:00
#if !CAP_AUDIO
void playSound(cell*, const string &s, int vol) { printf("play sound: %s vol %d\n", s.c_str(), vol); }
#endif
2017-10-29 11:46:57 +00:00
#endif
}