1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-23 21:07:17 +00:00
This commit is contained in:
Zeno Rogue 2017-03-31 21:41:09 +02:00
parent 51f2ff9d4a
commit b7450edef5
9 changed files with 227 additions and 32 deletions

View File

@ -5,6 +5,7 @@
#define MOBPAR_FORMAL int #define MOBPAR_FORMAL int
#define MOBPAR_ACTUAL 0 #define MOBPAR_ACTUAL 0
#define FAKEMOBILE #define FAKEMOBILE
#define ANDROIDSHARE
#define MIX_MAX_VOLUME 128 #define MIX_MAX_VOLUME 128
const char *scorefile = "fakemobile_score.txt"; const char *scorefile = "fakemobile_score.txt";
@ -90,6 +91,10 @@ void viewAchievements() { printf("view Achievements\n"); }
void viewLeaderboard(string id) { printf("view Leaderboard :: %s\n", id.c_str()); } void viewLeaderboard(string id) { printf("view Leaderboard :: %s\n", id.c_str()); }
void switchGoogleConnection() { printf("sgc\n"); } void switchGoogleConnection() { printf("sgc\n"); }
void shareScore(int) {
printf("share\n");
}
int main(int argc, char **argv) { int main(int argc, char **argv) {
initAll(); initAll();

View File

@ -5282,6 +5282,8 @@ void activateSafety(eLand l) {
restartGraph(); restartGraph();
} }
bool legalmoves[8];
bool hasSafeOrb(cell *c) { bool hasSafeOrb(cell *c) {
return return
c->item == itOrbSafety || c->item == itOrbSafety ||
@ -5299,15 +5301,20 @@ void checkmove() {
// do not activate orbs! // do not activate orbs!
for(int i=0; i<ittypes; i++) orbusedbak[i] = orbused[i]; for(int i=0; i<ittypes; i++) orbusedbak[i] = orbused[i];
for(int i=0; i<8; i++) legalmoves[i] = false;
canmove = false; canmove = false;
items[itWarning]+=2; items[itWarning]+=2;
if(movepcto(-1, 0, true)) canmove = true; if(movepcto(-1, 0, true)) canmove = legalmoves[7] = true;
if(!canmove)
if(ISMOBILE || !canmove)
for(int i=0; i<cwt.c->type; i++) for(int i=0; i<cwt.c->type; i++)
if(movepcto(1, -1, true)) canmove = true; if(movepcto(1, -1, true))
if(!canmove) canmove = legalmoves[cwt.spin] = true;
if(ISMOBILE || !canmove)
for(int i=0; i<cwt.c->type; i++) for(int i=0; i<cwt.c->type; i++)
if(movepcto(1, 1, true)) canmove = true; if(movepcto(1, 1, true))
canmove = legalmoves[cwt.spin] = true;
if(kills[moPlayer]) canmove = false; if(kills[moPlayer]) canmove = false;
if(!canmove) if(!canmove)
achievement_final(true); achievement_final(true);

View File

@ -1886,7 +1886,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
return false; return false;
} }
else if(m == moGolem) { else if(m == moGolem || m == moGolemMoved) {
ShadowV(V, shPBody); ShadowV(V, shPBody);
otherbodyparts(V, darkena(col, 1, 0XC0), m, footphase); otherbodyparts(V, darkena(col, 1, 0XC0), m, footphase);
queuepoly(VBODY, shPBody, darkena(col, 0, 0XC0)); queuepoly(VBODY, shPBody, darkena(col, 0, 0XC0));
@ -1947,7 +1947,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
} }
} }
else if(m == moWolf || m == moRedFox) { else if(m == moWolf || m == moRedFox || m == moWolfMoved) {
ShadowV(V, shWolfBody); ShadowV(V, shWolfBody);
if(mmspatial || footphase) if(mmspatial || footphase)
animallegs(VALEGS, moWolf, darkena(col, 0, 0xFF), footphase); animallegs(VALEGS, moWolf, darkena(col, 0, 0xFF), footphase);
@ -2033,7 +2033,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
else if(m == moShark || m == moGreaterShark || m == moCShark) else if(m == moShark || m == moGreaterShark || m == moCShark)
queuepoly(VFISH, shShark, darkena(col, 0, 0xFF)); queuepoly(VFISH, shShark, darkena(col, 0, 0xFF));
else if(m == moEagle || m == moParrot || m == moBomberbird || m == moAlbatross || else if(m == moEagle || m == moParrot || m == moBomberbird || m == moAlbatross ||
m == moTameBomberbird || m == moWindCrow) { m == moTameBomberbird || m == moWindCrow || m == moTameBomberbirdMoved) {
ShadowV(V, shEagle); ShadowV(V, shEagle);
queuepoly(VBIRD, shEagle, darkena(col, 0, 0xFF)); queuepoly(VBIRD, shEagle, darkena(col, 0, 0xFF));
} }
@ -3052,9 +3052,14 @@ void drawMobileArrow(cell *c, transmatrix V) {
// int col = getcs().uicolor; // int col = getcs().uicolor;
// col -= (col & 0xFF) >> 1; // col -= (col & 0xFF) >> 1;
int dir = neighborId(cwt.c, c);
bool invalid = !legalmoves[dir];
int col = cellcolor(c); int col = cellcolor(c);
if(col == OUTLINE_NONE) col = 0xC0C0C0FF; if(col == OUTLINE_NONE) col = 0xC0C0C0FF;
col -= (col & 0xFF) >> 1; col -= (col & 0xFF) >> 1;
if(invalid) col -= (col & 0xFF) >> 1;
if(invalid) col -= (col & 0xFF) >> 1;
poly_outline = OUTLINE_NONE; poly_outline = OUTLINE_NONE;
transmatrix m2 = Id; transmatrix m2 = Id;
@ -5237,7 +5242,9 @@ void drawMarkers() {
using namespace shmupballs; using namespace shmupballs;
calc(); calc();
queuecircle(xmove, yb, rad, 0xFF0000FF); queuecircle(xmove, yb, rad, 0xFF0000FF);
queuecircle(xmove, yb, rad*SKIPFAC, 0xFF0000FF); queuecircle(xmove, yb, rad*SKIPFAC,
legalmoves[7] ? 0xFF0000FF : 0xFF000080
);
forCellAll(c2, cwt.c) IG(c2) drawMobileArrow(c2, Gm(c2)); forCellAll(c2, cwt.c) IG(c2) drawMobileArrow(c2, Gm(c2));
} }
#endif #endif
@ -5394,7 +5401,7 @@ string buildHelpText() {
h += XLAT("(You can also use right Shift)\n\n"); h += XLAT("(You can also use right Shift)\n\n");
#endif #endif
h += XLAT("See more on the website: ") h += XLAT("See more on the website: ")
+ "http//roguetemple.com/z/hyper.php\n\n"; + "http//roguetemple.com/z/hyper/\n\n";
h += XLAT("Still confused? Read the FAQ on the HyperRogue website!\n\n"); h += XLAT("Still confused? Read the FAQ on the HyperRogue website!\n\n");
@ -6224,6 +6231,9 @@ void drawthemap() {
modist = 1e20; mouseover = NULL; modist = 1e20; mouseover = NULL;
modist2 = 1e20; mouseover2 = NULL; modist2 = 1e20; mouseover2 = NULL;
mouseovers = XLAT("Press F1 or right click for help"); mouseovers = XLAT("Press F1 or right click for help");
#ifdef ROGUEVIZ
if(rogueviz::on) mouseovers = " ";
#endif
centdist = 1e20; centerover = NULL; centdist = 1e20; centerover = NULL;
for(int i=0; i<multi::players; i++) { for(int i=0; i<multi::players; i++) {
@ -6741,7 +6751,7 @@ void showGameover() {
#ifndef MOBILE #ifndef MOBILE
dialog::addItem(quitsaves() ? "save" : "quit", SDLK_F10); dialog::addItem(quitsaves() ? "save" : "quit", SDLK_F10);
#endif #endif
#ifdef ANDROID #ifdef ANDROIDSHARE
dialog::addItem("SHARE", 's'-96); dialog::addItem("SHARE", 's'-96);
#endif #endif

View File

@ -249,7 +249,7 @@ public class HyperRogue extends Activity {
void openWebsite() { void openWebsite() {
Runnable r = new Runnable() { Runnable r = new Runnable() {
public void run() { public void run() {
String url = "http://roguetemple.com/z/hyper.php"; String url = "http://roguetemple.com/z/hyper/";
Intent i = new Intent(Intent.ACTION_VIEW); Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url)); i.setData(Uri.parse(url));
startActivity(i); startActivity(i);

View File

@ -25,6 +25,8 @@
#define ANDROID #define ANDROID
#endif #endif
#define ANDROIDSHARE
#define MOBPAR_FORMAL JNIEnv *env, jobject thiz #define MOBPAR_FORMAL JNIEnv *env, jobject thiz
#define MOBPAR_ACTUAL env, thiz #define MOBPAR_ACTUAL env, thiz

View File

@ -1,6 +1,6 @@
#define VER "9.4c" #define VER "9.4d"
#define VERNUM 9403 #define VERNUM 9404
#define VERNUM_HEX 0x9403 #define VERNUM_HEX 0x9404
#define GEN_M 0 #define GEN_M 0
#define GEN_F 1 #define GEN_F 1
@ -224,7 +224,7 @@ string buildScoreDescription() {
char buf2[128]; char buf2[128];
s += XLAT("HyperRogue for Android"); s += XLAT("HyperRogue for Android");
s += " ("VER"), http://www.roguetemple.com/z/hyper.php\n"; s += " ("VER"), http://www.roguetemple.com/z/hyper/\n";
s += XLAT("Date: %1 time: %2 s ", buf, its(savetime + time(NULL) - timerstart)); s += XLAT("Date: %1 time: %2 s ", buf, its(savetime + time(NULL) - timerstart));
s += XLAT("distance: %1\n", its(celldist(cwt.c))); s += XLAT("distance: %1\n", its(celldist(cwt.c)));
// s += buf2; // s += buf2;
@ -294,7 +294,7 @@ void handleclick(MOBPAR_FORMAL) {
if(buttonclicked || outofmap(mouseh)) { if(buttonclicked || outofmap(mouseh)) {
if(andmode == 0 && getcstat == 'g' && !shmup::on) { if(andmode == 0 && getcstat == 'g' && !shmup::on && (cmode == emNormal || cmode == emQuit)) {
movepcto(MD_DROP); movepcto(MD_DROP);
getcstat = 0; getcstat = 0;
} }
@ -363,6 +363,10 @@ int touchedAt;
int getticks(); int getticks();
#ifdef ANDROIDSHARE
void shareScore(MOBPAR_FORMAL);
#endif
void mobile_draw(MOBPAR_FORMAL) { void mobile_draw(MOBPAR_FORMAL) {
optimizeview(); optimizeview();
@ -454,8 +458,8 @@ void mobile_draw(MOBPAR_FORMAL) {
if(inslider) keyreact = true; if(inslider) keyreact = true;
#ifdef ANDROID #ifdef ANDROIDSHARE
if(getcstat == 's'-96) { if(getcstat == 's'-96 && keyreact) {
cmode = canmove ? emQuit : emNormal; cmode = canmove ? emQuit : emNormal;
shareScore(MOBPAR_ACTUAL); shareScore(MOBPAR_ACTUAL);
cmode = emNormal; cmode = emNormal;

View File

@ -1796,6 +1796,21 @@ namespace mapeditor {
} }
return (0x808080 + col[0] + (col[1] << 8) + (col[2] << 16)) >> (err?2:0); return (0x808080 + col[0] + (col[1] << 8) + (col[2] << 16)) >> (err?2:0);
} }
if(whichCanvas == 'd') {
int col[4];
bool err = false;
for(int j=0; j<4; j++) {
col[j] = getCdata(c, j);
col[j] *= 3;
col[j] %= 240;
if(col[j] > 120) col[j] = 240 - col[j];
if(col[j] < -120) col[j] = -240 - col[j];
}
col[0] /= 8;
col[1] /= 8;
col[2] /= 8;
return (0x101010 + col[0] + (col[1] << 8) + (col[2] << 16)) >> (err?2:0);
}
return canvasback; return canvasback;
} }
} }

View File

@ -220,10 +220,12 @@ void showMainMenu() {
#endif #endif
#ifdef MOBILE #ifdef MOBILE
#ifdef HAVE_ACHIEVEMENTS
dialog::addItem(XLAT("leaderboards/achievements"), '3'); dialog::addItem(XLAT("leaderboards/achievements"), '3');
#endif #endif
#endif
#ifdef ANDROID #ifdef ANDROIDSHARE
dialog::addItem("SHARE", 's'-96); dialog::addItem("SHARE", 's'-96);
#endif #endif
@ -279,11 +281,13 @@ void handleMenuKey(int sym, int uni) {
achievement_final(false); achievement_final(false);
} }
#ifdef MOBILE #ifdef MOBILE
#ifdef HAVE_ACHIEVEMENTS
else if(sym == '3') { else if(sym == '3') {
achievement_final(false); achievement_final(false);
cmode = emLeader; cmode = emLeader;
} }
#endif #endif
#endif
#ifdef ROGUEVIZ #ifdef ROGUEVIZ
else if(uni == 'g') cmode = emRogueviz; else if(uni == 'g') cmode = emRogueviz;
#endif #endif

View File

@ -30,7 +30,7 @@ bool specialmark = false;
const char *fname; const char *fname;
const char *cfname; const char *cfname;
enum eVizkind { kNONE, kAnyGraph, kTree, kSpiral, kSAG }; enum eVizkind { kNONE, kAnyGraph, kTree, kSpiral, kSAG, kCollatz };
eVizkind kind; eVizkind kind;
bool on; bool on;
@ -58,6 +58,58 @@ colorpair parse(const string& s) {
return cp; return cp;
} }
int nh = 0;
int hues[256*6];
void buildhue() {
unsigned mh = 193;
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x1000000*mh + (unsigned) 0x10000 * y);
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x1010000*mh - 0x1000000 * y);
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x0010000*mh + 0x100 * y);
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x0010100*mh - 0x10000 * y);
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x0000100*mh + 0x1000000 * y);
for(unsigned y=0; y<=mh; y++)
hues[nh++] = (int) (0xFF + 0x1000100*mh - 0x100 * y);
}
int perturb(int c) {
if(nh == 0) buildhue();
int hueid = 0;
for(int t=0; t<nh; t++) if(hues[t] == c) hueid = t;
hueid += rand() % 50;
hueid -= rand() % 50;
if(hueid<0) hueid += nh;
hueid %= nh;
return hues[hueid];
/*
int part[4];
for(int u=0; u<=3; u++) {
part[u] = (c >> (8*u)) & 0xFF;
}
int
if(part[1] == 255 && part[2] == 0)
int k =
k += rand() % 16;
k -= rand() % 16;
if(k<0) k=-k;
if(k>255) k = 255-(k-255);
c &=~ (0xFF << (8*u));
c |= k << (8*u);
} */
return c;
}
colorpair perturb(colorpair cp) {
cp.color1 = perturb(cp.color1);
cp.color2 = perturb(cp.color2);
return cp;
}
struct vertexdata { struct vertexdata {
vector<pair<int, edgeinfo*> > edges; vector<pair<int, edgeinfo*> > edges;
string name; string name;
@ -187,6 +239,24 @@ namespace spiral {
} }
} }
namespace collatz {
double s2, s3, p2, p3;
void start() {
init(); kind = kCollatz;
vdata.resize(1);
vertexdata& vd = vdata[0];
createViz(0, cwt.c, Id);
virtualRebase(vd.m, true);
vd.cp = dftcolor;
vd.data = 0;
addedge(0, 0, 0, false);
vd.name = "1";
storeall();
}
}
int readLabel(FILE *f) { int readLabel(FILE *f) {
char xlabel[10000]; char xlabel[10000];
if(fscanf(f, "%9500s", xlabel) <= 0) return -1; if(fscanf(f, "%9500s", xlabel) <= 0) return -1;
@ -310,11 +380,12 @@ namespace tree {
} }
readnode(f, -1); readnode(f, -1);
fclose(f); fclose(f);
int N = size(vdata);
printf("N = %d\n", N);
printf("Assigning spos/epos...\n"); printf("Assigning spos/epos...\n");
spos(0, 0); spos(0, 0);
printf("Creating vertices...\n");
xpos *= 6; xpos *= 6;
int N = size(vdata); printf("Creating vertices...\n");
for(int i=0; i<N; i++) { for(int i=0; i<N; i++) {
treevertex& lv = tol[i]; treevertex& lv = tol[i];
vertexdata& vd = vdata[i]; vertexdata& vd = vdata[i];
@ -929,6 +1000,15 @@ void drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
display(shmup::calc_gmatrix(vd2.m->base)); display(shmup::calc_gmatrix(vd2.m->base));
} */ } */
int col =
((hilite ? 0xFF0000 : backcolor ? 0x808080 : 0xFFFFFF) << 8) + xlalpha;
if(pmodel) {
queueline(h1, h2, col, 2);
lastptd().prio = PPR_STRUCT0;
}
else {
if(ei->orig && ei->orig->cpdist >= 3) ei->orig = NULL; if(ei->orig && ei->orig->cpdist >= 3) ei->orig = NULL;
if(!ei->orig) { if(!ei->orig) {
ei->orig = cwt.c; ei->orig = cwt.c;
@ -936,9 +1016,10 @@ void drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
transmatrix T = inverse(shmup::ggmatrix(ei->orig)); transmatrix T = inverse(shmup::ggmatrix(ei->orig));
storeline(ei->prec, T*h1, T*h2); storeline(ei->prec, T*h1, T*h2);
} }
queuetable(shmup::ggmatrix(ei->orig), &ei->prec[0], size(ei->prec)/3, ((hilite ? 0xFF0000 : backcolor ? 0x808080 : 0xFFFFFF) << 8) + xlalpha, 0, queuetable(shmup::ggmatrix(ei->orig), &ei->prec[0], size(ei->prec)/3, col, 0,
PPR_STRUCT0); PPR_STRUCT0);
} }
}
/* /*
*/ */
} }
@ -962,6 +1043,66 @@ void drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
if(doshow) queuestr(V2, (svg::in ? .28 : .2) * crossf / hcrossf, vd.name, backcolor ? 0x000000 : 0xFFFF00, svg::in ? 0 : 1); if(doshow) queuestr(V2, (svg::in ? .28 : .2) * crossf / hcrossf, vd.name, backcolor ? 0x000000 : 0xFFFF00, svg::in ? 0 : 1);
lastptd().info = vd.info; lastptd().info = vd.info;
} }
if(kind == kCollatz) {
if(vd.data == 2) {
// doubler vertex
string s = vd.name;
colorpair cp = vd.cp;
vd.data = 20;
int i0 = size(vdata);
vdata.resize(i0+1);
vertexdata& vdn = vdata[i0];
createViz(i0, m->base, m->at * spin(collatz::s2) * xpush(collatz::p2));
virtualRebase(vdn.m, true);
vdn.cp = perturb(cp);
vdn.data = 0;
addedge(i, i0, 0, false);
vdn.m->store();
int carry = 0;
string s2 = s;
for(int i=size(s2)-1; i>=0; i--) {
int x = 2*(s2[i] - '0') + carry;
carry = x>=10;
if(carry) x-=10;
s2[i] = '0'+x;
}
if(carry) s2 = "1" + s2;
vdn.name = s2;
int m3 = 0;
for(int i=0; i<size(s); i++) m3 += s[i] - '0';
if(m3 % 3 == 2 && s != "2" && s != "1") {
vdata.resize(i0+2);
vertexdata& vdn = vdata[i0+1];
createViz(i0+1, m->base, m->at * spin(collatz::s3) * xpush(collatz::p3));
virtualRebase(vdn.m, true);
vdn.cp = perturb(cp);
vdn.data = 0;
addedge(i, i0+1, 0, false);
vdn.m->store();
int carry = -1;
string s2 = s;
for(int i=size(s2)-1; i>=0; i--) {
carry += 2 * (s2[i] - '0');
int ncarry = 0;
while(carry % 3) carry += 10, ncarry--;
if(carry >= 30) carry -= 30, ncarry += 3;
s2[i] = '0'+carry/3;
carry = ncarry;
}
if(s2[0] == '0') s2 = s2.substr(1);
vdn.name = s2;
vdn.cp = perturb(vdn.cp);
}
}
else if(vd.data < 2) {
vd.data++;
fixmatrix(vd.m->at);
}
}
} }
bool virt(shmup::monster *m) { bool virt(shmup::monster *m) {
@ -1166,6 +1307,13 @@ int readArgs() {
// example commandline: // example commandline:
// -spiral 2,10000 -spiraledge 0,2 -spiraledge 1,1 -lab -spiralcolor 2 FF4040FF // -spiral 2,10000 -spiraledge 0,2 -spiraledge 1,1 -lab -spiralcolor 2 FF4040FF
else if(argis("-collatz")) {
PHASE(3);
using namespace collatz;
shift(); sscanf(args(), "%lf,%lf,%lf,%lf", &s2, &p2, &s3, &p3);
start();
}
else if(argis("-spiral")) { else if(argis("-spiral")) {
PHASE(3); PHASE(3);
ld mul = 2; ld mul = 2;