mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-07-14 23:22:49 +00:00
a HUD for square screens; graphical images in HUD
This commit is contained in:
parent
a10da94fe9
commit
adcb05f256
@ -1951,6 +1951,7 @@ void livecaves() {
|
|||||||
namespace tortoise {
|
namespace tortoise {
|
||||||
map<cell*, cell*> emap;
|
map<cell*, cell*> emap;
|
||||||
map<cell*, int> babymap;
|
map<cell*, int> babymap;
|
||||||
|
int last;
|
||||||
|
|
||||||
enum tflag {
|
enum tflag {
|
||||||
tfShell, tfScute0, tfScute1, tfScute2, tfScute3,
|
tfShell, tfScute0, tfScute1, tfScute2, tfScute3,
|
||||||
|
1
game.cpp
1
game.cpp
@ -5736,6 +5736,7 @@ bool collectItem(cell *c2, bool telekinesis) {
|
|||||||
babymap.erase(c2);
|
babymap.erase(c2);
|
||||||
int bold = seekbits;
|
int bold = seekbits;
|
||||||
seekbits = bnew;
|
seekbits = bnew;
|
||||||
|
last = seekbits;
|
||||||
if(seek()) {
|
if(seek()) {
|
||||||
cell *c = passable(cwt.c, NULL, 0) ? cwt.c : c2;
|
cell *c = passable(cwt.c, NULL, 0) ? cwt.c : c2;
|
||||||
c->item = itBabyTortoise;
|
c->item = itBabyTortoise;
|
||||||
|
544
graph.cpp
544
graph.cpp
@ -46,6 +46,7 @@ TTF_Font *font[256];
|
|||||||
ld shiftmul = 1;
|
ld shiftmul = 1;
|
||||||
|
|
||||||
bool inHighQual; // taking high quality screenshot
|
bool inHighQual; // taking high quality screenshot
|
||||||
|
bool auraNOGL; // aura without GL
|
||||||
|
|
||||||
// R:239, G:208, B:207
|
// R:239, G:208, B:207
|
||||||
|
|
||||||
@ -126,7 +127,7 @@ int ZZ;
|
|||||||
|
|
||||||
string help;
|
string help;
|
||||||
|
|
||||||
#ifndef OLDCOMPILE
|
#ifndef NOLAMBDAS
|
||||||
function<void()> help_delegate;
|
function<void()> help_delegate;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1696,6 +1697,142 @@ bool drawstar(cell *c) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool drawItemType(eItem it, cell *c, const transmatrix& V, int icol, int ticks, bool hidden) {
|
||||||
|
char xch = iinf[it].glyph;
|
||||||
|
int ct6 = c ? c->type-6 : 0;
|
||||||
|
hpcshape *xsh =
|
||||||
|
(it == itPirate || it == itKraken) ? &shPirateX :
|
||||||
|
(it == itBuggy || it == itBuggy2) ? &shPirateX :
|
||||||
|
it == itHolyGrail ? &shGrail :
|
||||||
|
isElementalShard(it) ? &shElementalShard :
|
||||||
|
(it == itBombEgg || it == itTrollEgg) ? &shEgg :
|
||||||
|
it == itDodeca ? &shDodeca :
|
||||||
|
xch == '*' ? &shGem[ct6] :
|
||||||
|
it == itTreat ? &shTreat :
|
||||||
|
it == itSlime ? &shEgg :
|
||||||
|
xch == '%' ? &shDaisy : xch == '$' ? &shStar : xch == ';' ? &shTriangle :
|
||||||
|
xch == '!' ? &shTriangle : it == itBone ? &shNecro : it == itStatue ? &shStatue :
|
||||||
|
it == itIvory ? &shFigurine :
|
||||||
|
xch == '?' ? &shBookCover :
|
||||||
|
it == itKey ? &shKey :
|
||||||
|
it == itRevolver ? &shGun :
|
||||||
|
NULL;
|
||||||
|
|
||||||
|
if(c && doHighlight()) {
|
||||||
|
int k = itemclass(it);
|
||||||
|
if(k == IC_TREASURE)
|
||||||
|
poly_outline = OUTLINE_TREASURE;
|
||||||
|
else if(k == IC_ORB)
|
||||||
|
poly_outline = OUTLINE_ORB;
|
||||||
|
else
|
||||||
|
poly_outline = OUTLINE_OTHER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(c && conformal::includeHistory && eq(c->aitmp, sval)) poly_outline = OUTLINE_DEAD;
|
||||||
|
|
||||||
|
if(!mmitem && it) return true;
|
||||||
|
|
||||||
|
else if(it == itSavedPrincess) {
|
||||||
|
drawMonsterType(moPrincess, c, V, icol, 0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itStrongWind) {
|
||||||
|
queuepoly(V * spin(ticks / 750.), shFan, darkena(icol, 0, 255));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itWarning) {
|
||||||
|
queuepoly(V * spin(ticks / 750.), shTriangle, darkena(icol, 0, 255));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itBabyTortoise) {
|
||||||
|
int bits = c ? tortoise::babymap[c] : tortoise::last;
|
||||||
|
int over = c && c->monst == moTortoise;
|
||||||
|
tortoise::draw(V * spin(ticks / 5000.) * ypush(crossf*.15), bits, over ? 4 : 2, 0);
|
||||||
|
// queuepoly(V, shHeptaMarker, darkena(tortoise::getMatchColor(bits), 0, 0xC0));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itCompass) {
|
||||||
|
transmatrix V2;
|
||||||
|
if(euclid) V2 = V * spin(M_PI/2); // todo incorrect
|
||||||
|
else V2 = V * rspintox(inverse(V) * pirateCoords);
|
||||||
|
V2 = V2 * spin(M_PI * sin(ticks/100.) / 30);
|
||||||
|
queuepoly(V2, shCompass1, 0xFF8080FF);
|
||||||
|
queuepoly(V2, shCompass2, 0xFFFFFFFF);
|
||||||
|
queuepoly(V2, shCompass3, 0xFF0000FF);
|
||||||
|
queuepoly(V2 * pispin, shCompass3, 0x000000FF);
|
||||||
|
xsh = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itPalace) {
|
||||||
|
transmatrix V2 = V * spin(ticks / 1500.);
|
||||||
|
queuepoly(V2, shMFloor3[ct6], 0xFFD500FF);
|
||||||
|
queuepoly(V2, shMFloor4[ct6], darkena(icol, 0, 0xFF));
|
||||||
|
queuepoly(V2, shGem[ct6], 0xFFD500FF);
|
||||||
|
xsh = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(drawUserShape(V, 2, it, darkena(icol, 0, 0xFF))) ;
|
||||||
|
|
||||||
|
else if(it == itRose) {
|
||||||
|
for(int u=0; u<4; u++)
|
||||||
|
queuepoly(V * spin(ticks / 1500.) * spin(2*M_PI / 3 / 4 * u), shRose, darkena(icol, 0, hidden ? 0x30 : 0xA0));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it == itBarrow && c) {
|
||||||
|
for(int i = 0; i<c->landparam; i++)
|
||||||
|
queuepolyat(V * spin(2 * M_PI * i / c->landparam) * xpush(.15) * spin(ticks / 1500.), *xsh, darkena(icol, 0, hidden ? 0x40 :
|
||||||
|
(highwall(c) && wmspatial) ? 0x60 : 0xFF),
|
||||||
|
PPR_HIDDEN);
|
||||||
|
|
||||||
|
// queuepoly(V*spin(M_PI+(1-2*ang)*2*M_PI/S84), shMagicSword, darkena(0xC00000, 0, 0x80 + 0x70 * sin(ticks / 200.0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(xsh) {
|
||||||
|
if(it == itFireShard) icol = firecolor(100);
|
||||||
|
if(it == itWaterShard) icol = watercolor(100) >> 8;
|
||||||
|
|
||||||
|
if(it == itZebra) icol = 0xFFFFFF;
|
||||||
|
if(it == itLotus) icol = 0x101010;
|
||||||
|
|
||||||
|
transmatrix V2 = V * spin(ticks / 1500.);
|
||||||
|
|
||||||
|
if(xsh == &shBookCover && mmitem)
|
||||||
|
queuepoly(V2, shBook, 0x805020FF);
|
||||||
|
|
||||||
|
queuepoly(V2, *xsh, darkena(icol, 0, hidden ? (it == itKraken ? 0xC0 : 0x40) : 0xF0));
|
||||||
|
|
||||||
|
if(it == itZebra)
|
||||||
|
queuepolyat(V * spin(ticks / 1500. + M_PI/(ct6+6)), *xsh, darkena(0x202020, 0, hidden ? 0x40 : 0xF0), PPR_ITEMb);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(xch == 'o') {
|
||||||
|
if(it == itOrbFire) icol = firecolor(100);
|
||||||
|
queuepoly(V, shDisk, darkena(icol, 0, hidden ? 0x20 : 0xC0));
|
||||||
|
if(it == itOrbFire) icol = firecolor(200);
|
||||||
|
if(it == itOrbFriend || it == itOrbDiscord) icol = 0xC0C0C0;
|
||||||
|
if(it == itOrbFrog) icol = 0xFF0000;
|
||||||
|
if(it == itOrbDash) icol = 0xFF0000;
|
||||||
|
if(it == itOrbFreedom) icol = 0xC0FF00;
|
||||||
|
if(it == itOrbAir) icol = 0xFFFFFF;
|
||||||
|
if(it == itOrbUndeath) icol = minf[moFriendlyGhost].color;
|
||||||
|
if(it == itOrbRecall) icol = 0x101010;
|
||||||
|
hpcshape& sh =
|
||||||
|
isRangedOrb(it) ? shTargetRing :
|
||||||
|
isOffensiveOrb(it) ? shSawRing :
|
||||||
|
isFriendOrb(it) ? shPeaceRing :
|
||||||
|
isUtilityOrb(it) ? shGearRing :
|
||||||
|
isDirectionalOrb(it) ? shSpearRing :
|
||||||
|
it == itOrb37 ? shHeptaRing :
|
||||||
|
shRing;
|
||||||
|
queuepoly(V * spin(ticks / 1500.), sh, darkena(icol, 0, int(0x80 + 0x70 * sin(ticks / 300.))));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(it) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, double footphase) {
|
bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, double footphase) {
|
||||||
|
|
||||||
char xch = minf[m].glyph;
|
char xch = minf[m].glyph;
|
||||||
@ -1712,9 +1849,9 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
drawStunStars(V, where->stuntime);
|
drawStunStars(V, where->stuntime);
|
||||||
|
|
||||||
if(m == moTortoise) {
|
if(m == moTortoise) {
|
||||||
int bits = where ? tortoise::getb(where) : 0;
|
int bits = where ? tortoise::getb(where) : tortoise::last;
|
||||||
tortoise::draw(V, bits, 0, where ? where->stuntime : 0);
|
tortoise::draw(V, bits, 0, where ? where->stuntime : 0);
|
||||||
if(tortoise::seek() && !tortoise::diff(bits))
|
if(tortoise::seek() && !tortoise::diff(bits) && where)
|
||||||
queuepoly(V, shRing, darkena(0xFFFFFF, 0, 0x80 + 0x70 * sin(ticks / 200.0)));
|
queuepoly(V, shRing, darkena(0xFFFFFF, 0, 0x80 + 0x70 * sin(ticks / 200.0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2109,7 +2246,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
queuepoly(VBIRD, shGargoyleBody, darkena(col, 0, 0xFF));
|
queuepoly(VBIRD, shGargoyleBody, darkena(col, 0, 0xFF));
|
||||||
}
|
}
|
||||||
else if(m == moZombie) {
|
else if(m == moZombie) {
|
||||||
int c = darkena(col, where->land == laHalloween ? 1 : 0, 0xFF);
|
int c = darkena(col, where && where->land == laHalloween ? 1 : 0, 0xFF);
|
||||||
otherbodyparts(V, c, m, footphase);
|
otherbodyparts(V, c, m, footphase);
|
||||||
ShadowV(V, shPBody);
|
ShadowV(V, shPBody);
|
||||||
queuepoly(VBODY, shPBody, c);
|
queuepoly(VBODY, shPBody, c);
|
||||||
@ -2136,7 +2273,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
if(m == moFatGuard) {
|
if(m == moFatGuard) {
|
||||||
queuepoly(VBODY, shFatBody, darkena(0xC06000, 0, 0xFF));
|
queuepoly(VBODY, shFatBody, darkena(0xC06000, 0, 0xFF));
|
||||||
col = 0xFFFFFF;
|
col = 0xFFFFFF;
|
||||||
if(where && where->hitpoints >= 3)
|
if(!where || where->hitpoints >= 3)
|
||||||
queuepoly(VBODY, shKnightCloak, darkena(0xFFC0C0, 1, 0xFF));
|
queuepoly(VBODY, shKnightCloak, darkena(0xFFC0C0, 1, 0xFF));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -2148,7 +2285,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
darkena(0x00FF00, 1, 0xFF));
|
darkena(0x00FF00, 1, 0xFF));
|
||||||
}
|
}
|
||||||
queuepoly(VHEAD, shTurban1, darkena(col, 1, 0xFF));
|
queuepoly(VHEAD, shTurban1, darkena(col, 1, 0xFF));
|
||||||
if(where && where->hitpoints >= 2)
|
if(!where || where->hitpoints >= 2)
|
||||||
queuepoly(VHEAD, shTurban2, darkena(col, 0, 0xFF));
|
queuepoly(VHEAD, shTurban2, darkena(col, 0, 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2264,9 +2401,9 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
else if(m == moRatling || m == moRatlingAvenger) {
|
else if(m == moRatling || m == moRatlingAvenger) {
|
||||||
otherbodyparts(V, darkena(col, 0, 0xFF), m, footphase);
|
otherbodyparts(V, darkena(col, 0, 0xFF), m, footphase);
|
||||||
ShadowV(V, shYeti);
|
ShadowV(V, shYeti);
|
||||||
|
queuepoly(VLEG, shRatTail, darkena(col, 0, 0xFF));
|
||||||
queuepoly(VBODY, shYeti, darkena(col, 1, 0xFF));
|
queuepoly(VBODY, shYeti, darkena(col, 1, 0xFF));
|
||||||
queuepoly(VHEAD, shRatHead, darkena(col, 0, 0xFF));
|
queuepoly(VHEAD, shRatHead, darkena(col, 0, 0xFF));
|
||||||
queuepoly(VLEG, shRatTail, darkena(col, 0, 0xFF));
|
|
||||||
|
|
||||||
float t = sin(ticks / 1000.0 + (where ? where->cpdist : 0));
|
float t = sin(ticks / 1000.0 + (where ? where->cpdist : 0));
|
||||||
int eyecol = t > 0.92 ? 0xFF0000 : 0;
|
int eyecol = t > 0.92 ? 0xFF0000 : 0;
|
||||||
@ -2313,7 +2450,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
// queuepoly(V, shSkull, 0xC06020D0);
|
// queuepoly(V, shSkull, 0xC06020D0);
|
||||||
//queuepoly(V, shSkullEyes, 0x000000D0);
|
//queuepoly(V, shSkullEyes, 0x000000D0);
|
||||||
// queuepoly(V, shWightCloak, 0xC0A080A0);
|
// queuepoly(V, shWightCloak, 0xC0A080A0);
|
||||||
int b = where->cpdist;
|
int b = where ? where->cpdist : 0;
|
||||||
b--;
|
b--;
|
||||||
if(b < 0) b = 0;
|
if(b < 0) b = 0;
|
||||||
if(b > 6) b = 6;
|
if(b > 6) b = 6;
|
||||||
@ -2401,7 +2538,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
queuepoly(VHEAD, shFemaleHair, darkena(col, 0, 0x80));
|
queuepoly(VHEAD, shFemaleHair, darkena(col, 0, 0x80));
|
||||||
queuepoly(VHEAD, shPFace, darkena(col, 0, 0x80));
|
queuepoly(VHEAD, shPFace, darkena(col, 0, 0x80));
|
||||||
}
|
}
|
||||||
else if(xch == 'd' || xch == 'D') {
|
else if((xch == 'd' || xch == 'D') && m != moDragonHead && m != moDragonTail) {
|
||||||
otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
|
otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
|
||||||
queuepoly(VBODY, shPBody, darkena(col, 1, 0xC0));
|
queuepoly(VBODY, shPBody, darkena(col, 1, 0xC0));
|
||||||
ShadowV(V, shPBody);
|
ShadowV(V, shPBody);
|
||||||
@ -2428,24 +2565,47 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, int col, dou
|
|||||||
}
|
}
|
||||||
else if(isWitch(m)) {
|
else if(isWitch(m)) {
|
||||||
otherbodyparts(V, darkena(col, 1, 0xFF), m, footphase);
|
otherbodyparts(V, darkena(col, 1, 0xFF), m, footphase);
|
||||||
int c = 0xFF;
|
int cc = 0xFF;
|
||||||
if(m == moWitchGhost) c = 0x85 + 120 * sin(ticks / 160.0);
|
if(m == moWitchGhost) cc = 0x85 + 120 * sin(ticks / 160.0);
|
||||||
if(m == moWitchWinter) drawWinter(V, 0);
|
if(m == moWitchWinter && where) drawWinter(V, 0);
|
||||||
if(m == moWitchFlash) drawFlash(V);
|
if(m == moWitchFlash && where) drawFlash(V);
|
||||||
if(m == moWitchSpeed) drawSpeed(V);
|
if(m == moWitchSpeed && where) drawSpeed(V);
|
||||||
if(m == moWitchFire) col = firecolor(0);
|
if(m == moWitchFire) col = firecolor(0);
|
||||||
ShadowV(V, shFemaleBody);
|
ShadowV(V, shFemaleBody);
|
||||||
queuepoly(VBODY, shFemaleBody, darkena(col, 0, c));
|
queuepoly(VBODY, shFemaleBody, darkena(col, 0, cc));
|
||||||
// queuepoly(cV2, ct, shPSword, darkena(col, 0, 0XFF));
|
// queuepoly(cV2, ct, shPSword, darkena(col, 0, 0XFF));
|
||||||
// queuepoly(V, shHood, darkena(col, 0, 0XC0));
|
// queuepoly(V, shHood, darkena(col, 0, 0XC0));
|
||||||
if(m == moWitchFire) col = firecolor(100);
|
if(m == moWitchFire) col = firecolor(100);
|
||||||
queuepoly(VHEAD, shWitchHair, darkena(col, 1, c));
|
queuepoly(VHEAD, shWitchHair, darkena(col, 1, cc));
|
||||||
if(m == moWitchFire) col = firecolor(200);
|
if(m == moWitchFire) col = firecolor(200);
|
||||||
queuepoly(VHEAD, shPFace, darkena(col, 0, c));
|
queuepoly(VHEAD, shPFace, darkena(col, 0, cc));
|
||||||
if(m == moWitchFire) col = firecolor(300);
|
if(m == moWitchFire) col = firecolor(300);
|
||||||
queuepoly(VBODY, shWitchDress, darkena(col, 1, 0XC0));
|
queuepoly(VBODY, shWitchDress, darkena(col, 1, 0XC0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// just for the HUD glyphs...
|
||||||
|
else if(isIvy(m) || isMutantIvy(m) || m == moFriendlyIvy) {
|
||||||
|
queuepoly(V, shILeaf[0], darkena(col, 0, 0xFF));
|
||||||
|
}
|
||||||
|
else if(m == moWorm || m == moWormwait || m == moHexSnake) {
|
||||||
|
queuepoly(V, shWormHead, darkena(col, 0, 0xFF));
|
||||||
|
queuepolyat(V, shEyes, 0xFF, PPR_ONTENTACLE_EYES);
|
||||||
|
}
|
||||||
|
else if(m == moDragonHead) {
|
||||||
|
queuepoly(V, shDragonHead, darkena(col, 0, 0xFF));
|
||||||
|
queuepolyat(V, shEyes, 0xFF, PPR_ONTENTACLE_EYES);
|
||||||
|
int noscolor = 0xFF0000FF;
|
||||||
|
queuepoly(V, shDragonNostril, noscolor);
|
||||||
|
queuepoly(V * Mirror, shDragonNostril, noscolor);
|
||||||
|
}
|
||||||
|
else if(m == moDragonTail) {
|
||||||
|
queuepoly(V, shDragonSegment, darkena(col, 0, 0xFF));
|
||||||
|
}
|
||||||
|
else if(m == moTentacle || m == moTentaclewait || m == moTentacleEscaping) {
|
||||||
|
queuepoly(V, shTentHead, darkena(col, 0, 0xFF));
|
||||||
|
ShadowV(V, shTentHead, PPR_GIANTSHADOW);
|
||||||
|
}
|
||||||
|
|
||||||
else return true;
|
else return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -2813,8 +2973,7 @@ int keycelldist;
|
|||||||
int aurac[AURA+1][4];
|
int aurac[AURA+1][4];
|
||||||
|
|
||||||
bool haveaura() {
|
bool haveaura() {
|
||||||
return pmodel == mdDisk && !sphere && !euclid && vid.aurastr>0 &&
|
return pmodel == mdDisk && !sphere && !euclid && vid.aurastr>0 && !svg::in && (auraNOGL || vid.usingGL);
|
||||||
!svg::in && (inHighQual || vid.usingGL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearaura() {
|
void clearaura() {
|
||||||
@ -4942,141 +5101,26 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// treasure
|
// treasure
|
||||||
|
|
||||||
char xch = iinf[it].glyph;
|
|
||||||
hpcshape *xsh =
|
|
||||||
(it == itPirate || it == itKraken) ? &shPirateX :
|
|
||||||
(it == itBuggy || it == itBuggy2) ? &shPirateX :
|
|
||||||
it == itHolyGrail ? &shGrail :
|
|
||||||
isElementalShard(it) ? &shElementalShard :
|
|
||||||
(it == itBombEgg || it == itTrollEgg) ? &shEgg :
|
|
||||||
it == itDodeca ? &shDodeca :
|
|
||||||
xch == '*' ? &shGem[ct6] :
|
|
||||||
it == itTreat ? &shTreat :
|
|
||||||
it == itSlime ? &shEgg :
|
|
||||||
xch == '%' ? &shDaisy : xch == '$' ? &shStar : xch == ';' ? &shTriangle :
|
|
||||||
xch == '!' ? &shTriangle : it == itBone ? &shNecro : it == itStatue ? &shStatue :
|
|
||||||
it == itIvory ? &shFigurine :
|
|
||||||
xch == '?' ? &shBookCover :
|
|
||||||
it == itKey ? &shKey :
|
|
||||||
it == itRevolver ? &shGun :
|
|
||||||
NULL;
|
|
||||||
|
|
||||||
|
|
||||||
if(c->land == laWhirlwind && c->wall != waBoat) {
|
if(c->land == laWhirlwind && c->wall != waBoat) {
|
||||||
double footphase = 0;
|
double footphase = 0;
|
||||||
Vboat = &(Vboat0 = *Vboat);
|
Vboat = &(Vboat0 = *Vboat);
|
||||||
applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(it && cellHalfvine(c)) {
|
|
||||||
int i =-1;
|
|
||||||
for(int t=0;t<6; t++) if(c->mov[t] && c->mov[t]->wall == c->wall)
|
|
||||||
i = t;
|
|
||||||
|
|
||||||
Vboat = &(Vboat0 = *Vboat * ddspin(c, i) * xpush(-.13));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(doHighlight()) {
|
|
||||||
int k = itemclass(it);
|
|
||||||
if(k == IC_TREASURE)
|
|
||||||
poly_outline = OUTLINE_TREASURE;
|
|
||||||
else if(k == IC_ORB)
|
|
||||||
poly_outline = OUTLINE_ORB;
|
|
||||||
else
|
|
||||||
poly_outline = OUTLINE_OTHER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(conformal::includeHistory && eq(c->aitmp, sval)) poly_outline = OUTLINE_DEAD;
|
|
||||||
|
|
||||||
#ifndef NOEDIT
|
#ifndef NOEDIT
|
||||||
if(c == mapeditor::drawcell && mapeditor::drawcellShapeGroup() == 2)
|
if(c == mapeditor::drawcell && mapeditor::drawcellShapeGroup() == 2)
|
||||||
mapeditor::drawtrans = V;
|
mapeditor::drawtrans = V;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(!mmitem && it)
|
if(it && cellHalfvine(c)) {
|
||||||
error = true;
|
int i =-1;
|
||||||
|
for(int t=0;t<6; t++) if(c->mov[t] && c->mov[t]->wall == c->wall)
|
||||||
else if(it == itBabyTortoise) {
|
i = t;
|
||||||
int bits = tortoise::babymap[c];
|
|
||||||
int over = c->monst == moTortoise;
|
Vboat = &(Vboat0 = *Vboat * ddspin(c, i) * xpush(-.13));
|
||||||
tortoise::draw(*Vboat * spin(ticks / 5000.) * ypush(crossf*.15), bits, over ? 4 : 2, 0);
|
|
||||||
// queuepoly(V, shHeptaMarker, darkena(tortoise::getMatchColor(bits), 0, 0xC0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(it == itCompass) {
|
error |= drawItemType(it, c, *Vboat, icol, ticks, hidden);
|
||||||
if(euclid) Vboat0 = (*Vdp) * spin(M_PI/2); // todo incorrect
|
|
||||||
else Vboat0 = *Vboat * rspintox(inverse(*Vboat) * pirateCoords);
|
|
||||||
Vboat0 = Vboat0 * spin(M_PI * sin(ticks/100.) / 30);
|
|
||||||
queuepoly(Vboat0, shCompass1, 0xFF8080FF);
|
|
||||||
queuepoly(Vboat0, shCompass2, 0xFFFFFFFF);
|
|
||||||
queuepoly(Vboat0, shCompass3, 0xFF0000FF);
|
|
||||||
queuepoly(Vboat0 * pispin, shCompass3, 0x000000FF);
|
|
||||||
xsh = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(it == itPalace) {
|
|
||||||
Vboat0 = *Vboat * spin(ticks / 1500.);
|
|
||||||
queuepoly(Vboat0, shMFloor3[ct6], 0xFFD500FF);
|
|
||||||
queuepoly(Vboat0, shMFloor4[ct6], darkena(icol, 0, 0xFF));
|
|
||||||
queuepoly(Vboat0, shGem[ct6], 0xFFD500FF);
|
|
||||||
xsh = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(drawUserShape(*Vboat, 2, it, darkena(icol, 0, 0xFF))) ;
|
|
||||||
|
|
||||||
else if(it == itRose) {
|
|
||||||
for(int u=0; u<4; u++)
|
|
||||||
queuepoly(*Vboat * spin(ticks / 1500.) * spin(2*M_PI / 3 / 4 * u), shRose, darkena(icol, 0, hidden ? 0x30 : 0xA0));
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(it == itBarrow) {
|
|
||||||
for(int i = 0; i<c->landparam; i++)
|
|
||||||
queuepolyat(*Vboat * spin(2 * M_PI * i / c->landparam) * xpush(.15) * spin(ticks / 1500.), *xsh, darkena(icol, 0, hidden ? 0x40 :
|
|
||||||
(highwall(c) && wmspatial) ? 0x60 : 0xFF),
|
|
||||||
PPR_HIDDEN);
|
|
||||||
|
|
||||||
// queuepoly(V*spin(M_PI+(1-2*ang)*2*M_PI/S84), shMagicSword, darkena(0xC00000, 0, 0x80 + 0x70 * sin(ticks / 200.0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(xsh) {
|
|
||||||
if(it == itFireShard) icol = firecolor(100);
|
|
||||||
if(it == itWaterShard) icol = watercolor(100) >> 8;
|
|
||||||
|
|
||||||
if(it == itZebra) icol = 0xFFFFFF;
|
|
||||||
if(it == itLotus) icol = 0x101010;
|
|
||||||
|
|
||||||
queuepoly(*Vboat * spin(ticks / 1500.), *xsh, darkena(icol, 0, hidden ? (it == itKraken ? 0xC0 : 0x40) : 0xF0));
|
|
||||||
|
|
||||||
if(xsh == &shBookCover && mmitem)
|
|
||||||
queuepoly(*Vboat * spin(ticks / 1500.), shBook, 0x805020FF);
|
|
||||||
if(it == itZebra)
|
|
||||||
queuepolyat(*Vboat * spin(ticks / 1500. + M_PI/c->type), *xsh, darkena(0x202020, 0, hidden ? 0x40 : 0xF0), PPR_ITEMb);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(xch == 'o') {
|
|
||||||
if(it == itOrbFire) icol = firecolor(100);
|
|
||||||
queuepoly(*Vboat, shDisk, darkena(icol, 0, hidden ? 0x20 : 0xC0));
|
|
||||||
if(it == itOrbFire) icol = firecolor(200);
|
|
||||||
if(it == itOrbFriend || it == itOrbDiscord) icol = 0xC0C0C0;
|
|
||||||
if(it == itOrbFrog) icol = 0xFF0000;
|
|
||||||
if(it == itOrbDash) icol = 0xFF0000;
|
|
||||||
if(it == itOrbFreedom) icol = 0xC0FF00;
|
|
||||||
if(it == itOrbAir) icol = 0xFFFFFF;
|
|
||||||
if(it == itOrbUndeath) icol = minf[moFriendlyGhost].color;
|
|
||||||
if(it == itOrbRecall) icol = 0x101010;
|
|
||||||
hpcshape& sh =
|
|
||||||
isRangedOrb(it) ? shTargetRing :
|
|
||||||
isOffensiveOrb(it) ? shSawRing :
|
|
||||||
isFriendOrb(it) ? shPeaceRing :
|
|
||||||
isUtilityOrb(it) ? shGearRing :
|
|
||||||
isDirectionalOrb(it) ? shSpearRing :
|
|
||||||
it == itOrb37 ? shHeptaRing :
|
|
||||||
shRing;
|
|
||||||
queuepoly(*Vboat * spin(ticks / 1500.), sh, darkena(icol, 0, int(0x80 + 0x70 * sin(ticks / 300.))));
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(it) error = true;
|
|
||||||
|
|
||||||
if(true) {
|
if(true) {
|
||||||
int q = ptds.size();
|
int q = ptds.size();
|
||||||
@ -7257,6 +7301,7 @@ int subclass(int i) {
|
|||||||
#define GLYPH_INPORTRAIT 128
|
#define GLYPH_INPORTRAIT 128
|
||||||
#define GLYPH_LOCAL2 256
|
#define GLYPH_LOCAL2 256
|
||||||
#define GLYPH_TARGET 512
|
#define GLYPH_TARGET 512
|
||||||
|
#define GLYPH_INSQUARE 1024
|
||||||
|
|
||||||
eGlyphsortorder glyphsortorder;
|
eGlyphsortorder glyphsortorder;
|
||||||
|
|
||||||
@ -7297,6 +7342,13 @@ void preparesort() {
|
|||||||
|
|
||||||
int glyphsortkey = 0;
|
int glyphsortkey = 0;
|
||||||
|
|
||||||
|
int glyphcorner(int i) {
|
||||||
|
if(i < ittypes)
|
||||||
|
return itemclass(eItem(i)) == IC_ORB ? 2 : 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool glyphsort(int i, int j) {
|
bool glyphsort(int i, int j) {
|
||||||
if(subclass(i) != subclass(j))
|
if(subclass(i) != subclass(j))
|
||||||
return subclass(i) < subclass(j);
|
return subclass(i) < subclass(j);
|
||||||
@ -7321,10 +7373,11 @@ int glyphflags(int gid) {
|
|||||||
eItem i = eItem(gid);
|
eItem i = eItem(gid);
|
||||||
if(itemclass(i) == IC_NAI) f |= GLYPH_NONUMBER;
|
if(itemclass(i) == IC_NAI) f |= GLYPH_NONUMBER;
|
||||||
if(isElementalShard(i)) {
|
if(isElementalShard(i)) {
|
||||||
f |= GLYPH_LOCAL;
|
f |= GLYPH_LOCAL | GLYPH_INSQUARE;
|
||||||
if(i == localshardof(cwt.c->land)) f |= GLYPH_LOCAL2;
|
if(i == localshardof(cwt.c->land)) f |= GLYPH_LOCAL2;
|
||||||
}
|
}
|
||||||
if(i == treasureType(cwt.c->land)) f |= GLYPH_LOCAL | GLYPH_LOCAL2 | GLYPH_IMPORTANT;
|
if(i == treasureType(cwt.c->land))
|
||||||
|
f |= GLYPH_LOCAL | GLYPH_LOCAL2 | GLYPH_IMPORTANT | GLYPH_INSQUARE;
|
||||||
if(i == itHolyGrail) {
|
if(i == itHolyGrail) {
|
||||||
if(items[i] >= 3) f |= GLYPH_MARKOVER;
|
if(items[i] >= 3) f |= GLYPH_MARKOVER;
|
||||||
}
|
}
|
||||||
@ -7333,7 +7386,7 @@ int glyphflags(int gid) {
|
|||||||
else if(items[i] < 10) f |= GLYPH_MARKTODO;
|
else if(items[i] < 10) f |= GLYPH_MARKTODO;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
f |= GLYPH_IMPORTANT;
|
f |= GLYPH_IMPORTANT | GLYPH_INSQUARE;
|
||||||
if(itemclass(i) == IC_ORB && items[i] < 10) f |= GLYPH_RUNOUT;
|
if(itemclass(i) == IC_ORB && items[i] < 10) f |= GLYPH_RUNOUT;
|
||||||
}
|
}
|
||||||
if(i == orbToTarget) f |= GLYPH_TARGET;
|
if(i == orbToTarget) f |= GLYPH_TARGET;
|
||||||
@ -7341,28 +7394,74 @@ int glyphflags(int gid) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eMonster m = eMonster(gid-ittypes);
|
eMonster m = eMonster(gid-ittypes);
|
||||||
if(m == moLesser) f |= GLYPH_IMPORTANT | GLYPH_DEMON | GLYPH_INPORTRAIT;
|
if(m == moLesser) f |= GLYPH_IMPORTANT | GLYPH_DEMON | GLYPH_INPORTRAIT | GLYPH_INSQUARE;
|
||||||
int isnat = isNative(cwt.c->land, m);
|
int isnat = isNative(cwt.c->land, m);
|
||||||
if(isnat) f |= GLYPH_LOCAL | GLYPH_IMPORTANT | GLYPH_INPORTRAIT;
|
if(isnat) f |= GLYPH_LOCAL | GLYPH_IMPORTANT | GLYPH_INPORTRAIT | GLYPH_INSQUARE;
|
||||||
if(isnat == 2) f |= GLYPH_LOCAL2;
|
if(isnat == 2) f |= GLYPH_LOCAL2;
|
||||||
if(m == monsterToSummon) f |= GLYPH_TARGET;
|
if(m == monsterToSummon) f |= GLYPH_TARGET;
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool displayglyph(int cx, int cy, int buttonsize, char glyph, int color, int qty, int flags) {
|
transmatrix atscreenpos(ld x, ld y, ld size) {
|
||||||
|
transmatrix V = Id;
|
||||||
|
|
||||||
|
// V[0][2] += (x - vid.xcenter) / vid.radius * (1+vid.alphax);
|
||||||
|
// V[1][2] += (y - vid.ycenter) / vid.radius * (1+vid.alphax);
|
||||||
|
// V[2][2] = size / vid.radius * 5;
|
||||||
|
|
||||||
|
V[0][2] += (x - vid.xcenter);
|
||||||
|
V[1][2] += (y - vid.ycenter);
|
||||||
|
V[0][0] = size * 1.2;
|
||||||
|
V[1][1] = size * 1.2;
|
||||||
|
V[2][2] = vid.scrdist;
|
||||||
|
|
||||||
|
return V;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool displayglyph(int cx, int cy, int buttonsize, char glyph, int color, int qty, int flags, int id) {
|
||||||
|
|
||||||
bool b =
|
bool b =
|
||||||
mousex >= cx && mousex < cx+buttonsize && mousey >= cy-buttonsize/2 && mousey <= cy-buttonsize/2+buttonsize;
|
mousex >= cx && mousex < cx+buttonsize && mousey >= cy-buttonsize/2 && mousey <= cy-buttonsize/2+buttonsize;
|
||||||
|
|
||||||
int glsize = buttonsize;
|
int glsize = buttonsize;
|
||||||
if(glyph == '%' || glyph == 'M' || glyph == 'W') glsize = glsize*4/5;
|
if(glyph == '%' || glyph == 'M' || glyph == 'W') glsize = glsize*4/5;
|
||||||
|
|
||||||
if(glyph == '*')
|
if(vid.graphglyph) {
|
||||||
|
ptds.clear();
|
||||||
|
poly_outline = OUTLINE_NONE;
|
||||||
|
if(id >= ittypes) {
|
||||||
|
eMonster m = eMonster(id - ittypes);
|
||||||
|
int bsize = buttonsize;
|
||||||
|
if(m == moKrakenH) bsize /= 2;
|
||||||
|
if(m == moSlime) bsize = (2*bsize+1)/3;
|
||||||
|
transmatrix V = atscreenpos(cx+buttonsize/2, cy, bsize);
|
||||||
|
int mcol = color;
|
||||||
|
mcol -= (color & 0xFCFCFC) >> 2;
|
||||||
|
drawMonsterType(m, NULL, V, mcol, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eItem it = eItem(id);
|
||||||
|
int bsize = buttonsize;
|
||||||
|
if(glyph =='*') bsize *= 2;
|
||||||
|
if(glyph == '$') bsize = (bsize*5+2)/3;
|
||||||
|
if(glyph == 'o') bsize *= 2;
|
||||||
|
if(glyph == 't') bsize = bsize*5/2;
|
||||||
|
if(it == itWarning) bsize *= 2;
|
||||||
|
if(it == itBombEgg || it == itTrollEgg || it == itDodeca) bsize = bsize*3/2;
|
||||||
|
transmatrix V = atscreenpos(cx+buttonsize/2, cy, bsize);
|
||||||
|
int icol = color;
|
||||||
|
icol -= (color & 0xFCFCFC) >> 2;
|
||||||
|
int ic = itemclass(it);
|
||||||
|
drawItemType(it, NULL, V, icol, (ic == IC_ORB || ic == IC_NAI) ? ticks*2 : (glyph == 't' && qty%5) ? ticks/2 : 0, false);
|
||||||
|
}
|
||||||
|
quickqueue();
|
||||||
|
}
|
||||||
|
else if(glyph == '*')
|
||||||
displaychr(cx + buttonsize/2, cy+buttonsize/4, 0, glsize*3/2, glyph, darkenedby(color, b?0:1));
|
displaychr(cx + buttonsize/2, cy+buttonsize/4, 0, glsize*3/2, glyph, darkenedby(color, b?0:1));
|
||||||
else
|
else
|
||||||
displaychr(cx + buttonsize/2, cy, 0, glsize, glyph, darkenedby(color, b?0:1));
|
displaychr(cx + buttonsize/2, cy, 0, glsize, glyph, darkenedby(color, b?0:1));
|
||||||
|
|
||||||
string fl = "";
|
string fl = "";
|
||||||
string str = its(qty);
|
string str = its(qty);
|
||||||
|
|
||||||
@ -7387,6 +7486,54 @@ bool displayglyph(int cx, int cy, int buttonsize, char glyph, int color, int qty
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void displayglyph2(int cx, int cy, int buttonsize, int i) {
|
||||||
|
|
||||||
|
char glyph = i < ittypes ? iinf[i].glyph : minf[i-ittypes].glyph;
|
||||||
|
int color = i < ittypes ? iinf[i].color : minf[i-ittypes].color;
|
||||||
|
int imp = glyphflags(i);
|
||||||
|
|
||||||
|
if(displayglyph(cx, cy, buttonsize, glyph, color, ikmerge(i), imp, i)) {
|
||||||
|
instat = true;
|
||||||
|
getcstat = SDLK_F1;
|
||||||
|
if(i < ittypes) {
|
||||||
|
eItem it = eItem(i);
|
||||||
|
int t = itemclass(it);
|
||||||
|
if(t == IC_TREASURE)
|
||||||
|
mouseovers = XLAT("treasure collected: %1", it);
|
||||||
|
if(t == IC_OTHER)
|
||||||
|
mouseovers = XLAT("objects found: %1", it);
|
||||||
|
if(t == IC_NAI)
|
||||||
|
mouseovers = XLAT("%1", it);
|
||||||
|
if(t == IC_ORB)
|
||||||
|
mouseovers = XLAT("orb power: %1", eItem(i));
|
||||||
|
if(it == itGreenStone) {
|
||||||
|
mouseovers += XLAT(" (click to drop)");
|
||||||
|
getcstat = 'g';
|
||||||
|
}
|
||||||
|
if(imp & GLYPH_LOCAL) mouseovers += XLAT(" (local treasure)");
|
||||||
|
help = generateHelpForItem(it);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eMonster m = eMonster(i-ittypes);
|
||||||
|
if(isMonsterPart(m))
|
||||||
|
mouseovers = s0 + XLAT("parts destroyed: %1", m);
|
||||||
|
else if(isFriendly(m) && isNonliving(m))
|
||||||
|
mouseovers = s0 + XLAT("friends destroyed: %1", m);
|
||||||
|
else if(isFriendly(m))
|
||||||
|
mouseovers = s0 + XLAT("friends killed: %1", m);
|
||||||
|
else if(isNonliving(m))
|
||||||
|
mouseovers = s0 + XLAT("monsters destroyed: %1", m);
|
||||||
|
else if(m == moTortoise)
|
||||||
|
mouseovers = s0 + XLAT("animals killed: %1", m);
|
||||||
|
else
|
||||||
|
mouseovers = s0 + XLAT("monsters killed: %1", m);
|
||||||
|
if(imp & GLYPH_LOCAL2) mouseovers += XLAT(" (killing increases treasure spawn)");
|
||||||
|
else if(imp & GLYPH_LOCAL) mouseovers += XLAT(" (appears here)");
|
||||||
|
help = generateHelpForMonster(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void drawStats() {
|
void drawStats() {
|
||||||
#ifdef ROGUEVIZ
|
#ifdef ROGUEVIZ
|
||||||
if(rogueviz::on) return;
|
if(rogueviz::on) return;
|
||||||
@ -7427,6 +7574,51 @@ void drawStats() {
|
|||||||
dialog::display();
|
dialog::display();
|
||||||
}
|
}
|
||||||
if(sidescreen) return;
|
if(sidescreen) return;
|
||||||
|
|
||||||
|
if(vid.xres > vid.yres * 85/100 && vid.yres > vid.xres * 85/100) {
|
||||||
|
int bycorner[4];
|
||||||
|
for(int u=0; u<4; u++) bycorner[u] = 0;
|
||||||
|
for(int i=0; i<glyphs; i++) if(ikmerge(i) && (glyphflags(i) & GLYPH_INSQUARE))
|
||||||
|
bycorner[glyphcorner(i)]++;
|
||||||
|
updatesort();
|
||||||
|
stable_sort(glyphorder, glyphorder+glyphs, glyphsort);
|
||||||
|
int rad = min(vid.xres, vid.yres) / 2;
|
||||||
|
for(int cor=0; cor<3; cor++) {
|
||||||
|
for(int a=5; a<41; a++) {
|
||||||
|
int s = min(vid.xres, vid.yres) / a;
|
||||||
|
int spots = 0;
|
||||||
|
for(int u=vid.fsize; u<vid.xres/2-s; u += s)
|
||||||
|
for(int v=vid.fsize; v<vid.yres/2-s; v += s)
|
||||||
|
if(hypot(vid.xres/2-u-s, vid.yres/2-v-s) > rad) {
|
||||||
|
spots++;
|
||||||
|
}
|
||||||
|
if(spots >= bycorner[cor] && spots >= 3) {
|
||||||
|
int next = 0;
|
||||||
|
vector<int> glyphstoshow;
|
||||||
|
for(int i=0; i<glyphs; i++) {
|
||||||
|
int g = glyphorder[i];
|
||||||
|
if(ikmerge(g) && (glyphflags(g) & GLYPH_INSQUARE) && glyphcorner(g) == cor)
|
||||||
|
glyphstoshow.push_back(g);
|
||||||
|
}
|
||||||
|
for(int u=vid.fsize; u<vid.xres/2-s; u += s)
|
||||||
|
for(int v=vid.fsize; v<vid.yres/2-s; v += s)
|
||||||
|
if(hypot(vid.xres/2-u-s, vid.yres/2-v-s) > rad) {
|
||||||
|
if(next >= size(glyphstoshow)) break;
|
||||||
|
|
||||||
|
int cx = u;
|
||||||
|
int cy = v + s/2;
|
||||||
|
if(cor&1) cx = vid.xres-1-s-cx;
|
||||||
|
if(cor&2) cy = vid.yres-1-cy;
|
||||||
|
|
||||||
|
displayglyph2(cx, cy, s, glyphstoshow[next++]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
instat = false;
|
instat = false;
|
||||||
bool portrait = vid.xres < vid.yres;
|
bool portrait = vid.xres < vid.yres;
|
||||||
int colspace = portrait ? (vid.yres - vid.xres - vid.fsize*3) : (vid.xres - vid.yres - 16) / 2;
|
int colspace = portrait ? (vid.yres - vid.xres - vid.fsize*3) : (vid.xres - vid.yres - 16) / 2;
|
||||||
@ -7484,49 +7676,7 @@ void drawStats() {
|
|||||||
|
|
||||||
rowid[z]++; if(rowid[z] >= rows) rowid[z] = 0, colid[z]++;
|
rowid[z]++; if(rowid[z] >= rows) rowid[z] = 0, colid[z]++;
|
||||||
|
|
||||||
char glyph = i < ittypes ? iinf[i].glyph : minf[i-ittypes].glyph;
|
displayglyph2(cx, cy, buttonsize, i);
|
||||||
int color = i < ittypes ? iinf[i].color : minf[i-ittypes].color;
|
|
||||||
|
|
||||||
if(displayglyph(cx, cy, buttonsize, glyph, color, ikmerge(i), imp)) {
|
|
||||||
instat = true;
|
|
||||||
getcstat = SDLK_F1;
|
|
||||||
if(i < ittypes) {
|
|
||||||
eItem it = eItem(i);
|
|
||||||
int t = itemclass(it);
|
|
||||||
if(t == IC_TREASURE)
|
|
||||||
mouseovers = XLAT("treasure collected: %1", it);
|
|
||||||
if(t == IC_OTHER)
|
|
||||||
mouseovers = XLAT("objects found: %1", it);
|
|
||||||
if(t == IC_NAI)
|
|
||||||
mouseovers = XLAT("%1", it);
|
|
||||||
if(t == IC_ORB)
|
|
||||||
mouseovers = XLAT("orb power: %1", eItem(i));
|
|
||||||
if(it == itGreenStone) {
|
|
||||||
mouseovers += XLAT(" (click to drop)");
|
|
||||||
getcstat = 'g';
|
|
||||||
}
|
|
||||||
if(imp & GLYPH_LOCAL) mouseovers += XLAT(" (local treasure)");
|
|
||||||
help = generateHelpForItem(it);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
eMonster m = eMonster(i-ittypes);
|
|
||||||
if(isMonsterPart(m))
|
|
||||||
mouseovers = s0 + XLAT("parts destroyed: %1", m);
|
|
||||||
else if(isFriendly(m) && isNonliving(m))
|
|
||||||
mouseovers = s0 + XLAT("friends destroyed: %1", m);
|
|
||||||
else if(isFriendly(m))
|
|
||||||
mouseovers = s0 + XLAT("friends killed: %1", m);
|
|
||||||
else if(isNonliving(m))
|
|
||||||
mouseovers = s0 + XLAT("monsters destroyed: %1", m);
|
|
||||||
else if(m == moTortoise)
|
|
||||||
mouseovers = s0 + XLAT("animals killed: %1", m);
|
|
||||||
else
|
|
||||||
mouseovers = s0 + XLAT("monsters killed: %1", m);
|
|
||||||
if(imp & GLYPH_LOCAL2) mouseovers += XLAT(" (killing increases treasure spawn)");
|
|
||||||
else if(imp & GLYPH_LOCAL) mouseovers += XLAT(" (appears here)");
|
|
||||||
help = generateHelpForMonster(m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string s0;
|
string s0;
|
||||||
@ -7612,6 +7762,7 @@ void saveHighQualityShot(const char *fname, const char *caption, int fade) {
|
|||||||
dynamicval<videopar> v(vid, vid);
|
dynamicval<videopar> v(vid, vid);
|
||||||
dynamicval<bool> v2(inHighQual, true);
|
dynamicval<bool> v2(inHighQual, true);
|
||||||
dynamicval<int> v4(cheater, 0);
|
dynamicval<int> v4(cheater, 0);
|
||||||
|
dynamicval<bool> v6(auraNOGL, fname ? true : false);
|
||||||
|
|
||||||
vid.xres = vid.yres = pngres;
|
vid.xres = vid.yres = pngres;
|
||||||
if(pngformat == 1) vid.xres = vid.yres * 4/3;
|
if(pngformat == 1) vid.xres = vid.yres * 4/3;
|
||||||
@ -8099,7 +8250,7 @@ void saveConfig() {
|
|||||||
float(vid.ballangle), float(vid.ballproj)
|
float(vid.ballangle), float(vid.ballproj)
|
||||||
);
|
);
|
||||||
|
|
||||||
fprintf(f, "%d %d %d\n", vid.mobilecompasssize, vid.aurastr, vid.aurasmoothen);
|
fprintf(f, "%d %d %d %d\n", vid.mobilecompasssize, vid.aurastr, vid.aurasmoothen, vid.graphglyph);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8120,7 +8271,7 @@ void saveConfig() {
|
|||||||
fprintf(f, "revcontrol, drawmousecircle, sight range, movement animation speed, sound effect volume, particle effects\n");
|
fprintf(f, "revcontrol, drawmousecircle, sight range, movement animation speed, sound effect volume, particle effects\n");
|
||||||
fprintf(f, "3D parameters, sort order\n");
|
fprintf(f, "3D parameters, sort order\n");
|
||||||
fprintf(f, "yhsift, camera angle, ball angle, ball projection\n");
|
fprintf(f, "yhsift, camera angle, ball angle, ball projection\n");
|
||||||
fprintf(f, "compass size\n");
|
fprintf(f, "compass size, aura strength, aura smoothen factor, graphical glyphs\n");
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
#ifndef MOBILE
|
#ifndef MOBILE
|
||||||
@ -8228,7 +8379,7 @@ void loadConfig() {
|
|||||||
|
|
||||||
readf(f, vid.yshift); readf(f, vid.camera_angle); readf(f, vid.ballangle); readf(f, vid.ballproj);
|
readf(f, vid.yshift); readf(f, vid.camera_angle); readf(f, vid.ballangle); readf(f, vid.ballproj);
|
||||||
|
|
||||||
err=fscanf(f, "%d%d%d\n", &vid.mobilecompasssize, &vid.aurastr, &vid.aurasmoothen);
|
err=fscanf(f, "%d%d%d%d\n", &vid.mobilecompasssize, &vid.aurastr, &vid.aurasmoothen, &vid.graphglyph);
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
DEBB(DF_INIT, (debugfile,"Loaded configuration: %s\n", conffile));
|
DEBB(DF_INIT, (debugfile,"Loaded configuration: %s\n", conffile));
|
||||||
@ -8287,6 +8438,7 @@ void initgraph() {
|
|||||||
vid.ballproj = 1;
|
vid.ballproj = 1;
|
||||||
vid.aurastr = 128;
|
vid.aurastr = 128;
|
||||||
vid.aurasmoothen = 5;
|
vid.aurasmoothen = 5;
|
||||||
|
vid.graphglyph = 1;
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
vid.monmode = 2;
|
vid.monmode = 2;
|
||||||
|
2
hyper.h
2
hyper.h
@ -293,6 +293,7 @@ struct videopar {
|
|||||||
bool full;
|
bool full;
|
||||||
bool goteyes; // for rendering
|
bool goteyes; // for rendering
|
||||||
bool goteyes2; // for choosing colors
|
bool goteyes2; // for choosing colors
|
||||||
|
int graphglyph; // graphical glyphs
|
||||||
bool darkhepta;
|
bool darkhepta;
|
||||||
int shifttarget;
|
int shifttarget;
|
||||||
|
|
||||||
@ -1192,3 +1193,4 @@ void switchFullscreen();
|
|||||||
string turnstring(int i);
|
string turnstring(int i);
|
||||||
int celldistance(cell *c1, cell *c2);
|
int celldistance(cell *c1, cell *c2);
|
||||||
bool behindsphere(const transmatrix& V);
|
bool behindsphere(const transmatrix& V);
|
||||||
|
extern hyperpoint pirateCoords;
|
||||||
|
@ -328,6 +328,7 @@ void showVisual1() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
dialog::addSelItem(XLAT("items/kills mode"), XLAT(vid.graphglyph ? "images" : "letters"), 'd');
|
||||||
dialog::addBoolItem(XLAT("mark heptagons"), (vid.darkhepta), '7');
|
dialog::addBoolItem(XLAT("mark heptagons"), (vid.darkhepta), '7');
|
||||||
dialog::addBoolItem(XLAT("draw the grid"), (vid.grid), '6');
|
dialog::addBoolItem(XLAT("draw the grid"), (vid.grid), '6');
|
||||||
dialog::addBoolItem(XLAT("extra graphical effects"), (vid.particles), 'u');
|
dialog::addBoolItem(XLAT("extra graphical effects"), (vid.particles), 'u');
|
||||||
@ -442,6 +443,8 @@ void handleVisual1(int sym, int uni) {
|
|||||||
|
|
||||||
if(xuni == '6') vid.grid = !vid.grid;
|
if(xuni == '6') vid.grid = !vid.grid;
|
||||||
if(xuni == 'u') vid.particles = !vid.particles;
|
if(xuni == 'u') vid.particles = !vid.particles;
|
||||||
|
|
||||||
|
if(xuni == 'd') vid.graphglyph = !vid.graphglyph;
|
||||||
|
|
||||||
if(xuni == 'j') {
|
if(xuni == 'j') {
|
||||||
dialog::editNumber(whatever, -10, 10, 1, 0, XLAT("whatever"),
|
dialog::editNumber(whatever, -10, 10, 1, 0, XLAT("whatever"),
|
||||||
|
128
polygons.cpp
128
polygons.cpp
@ -430,6 +430,73 @@ void prettyline(hyperpoint h1, hyperpoint h2, int col, int lev) {
|
|||||||
vector<GLfloat> curvedata;
|
vector<GLfloat> curvedata;
|
||||||
int curvestart = 0;
|
int curvestart = 0;
|
||||||
|
|
||||||
|
void drawqueueitem(polytodraw& ptd) {
|
||||||
|
#ifdef ROGUEVIZ
|
||||||
|
svg::info = ptd.info;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// if(ptd.prio == 46) printf("eye size %d\n", polyi);
|
||||||
|
|
||||||
|
if(ptd.kind == pkResetModel) {
|
||||||
|
pmodel = eModel(ptd.col);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ptd.kind == pkPoly) {
|
||||||
|
if(ptd.u.poly.curveindex >= 0)
|
||||||
|
ptd.u.poly.tab = &curvedata[ptd.u.poly.curveindex];
|
||||||
|
drawpolyline(ptd.u.poly.V, ptd.u.poly.tab, ptd.u.poly.cnt, ptd.col, ptd.u.poly.outline);
|
||||||
|
}
|
||||||
|
else if(ptd.kind == pkLine) {
|
||||||
|
prettyline(ptd.u.line.H1, ptd.u.line.H2, ptd.col, ptd.u.line.prf);
|
||||||
|
}
|
||||||
|
else if(ptd.kind == pkString) {
|
||||||
|
qchr& q(ptd.u.chr);
|
||||||
|
#ifndef MOBILE
|
||||||
|
if(svg::in)
|
||||||
|
svg::text(q.x, q.y, q.size, q.str, q.frame, ptd.col, q.align);
|
||||||
|
else {
|
||||||
|
if(q.frame) {
|
||||||
|
displaystr(q.x-q.frame, q.y, q.shift, q.size, q.str, 0, q.align);
|
||||||
|
displaystr(q.x+q.frame, q.y, q.shift, q.size, q.str, 0, q.align);
|
||||||
|
displaystr(q.x, q.y-q.frame, q.shift, q.size, q.str, 0, q.align);
|
||||||
|
displaystr(q.x, q.y+q.frame, q.shift, q.size, q.str, 0, q.align);
|
||||||
|
}
|
||||||
|
displaystr(q.x, q.y, q.shift, q.size, q.str, ptd.col, q.align);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
displayfr(q.x, q.y, q.frame, q.size, q.str, ptd.col, q.align);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if(ptd.kind == pkCircle) {
|
||||||
|
#ifndef MOBILE
|
||||||
|
if(svg::in)
|
||||||
|
svg::circle(ptd.u.cir.x, ptd.u.cir.y, ptd.u.cir.size, ptd.col);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
drawCircle(ptd.u.cir.x, ptd.u.cir.y, ptd.u.cir.size, ptd.col);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NOSDL
|
||||||
|
if(vid.goteyes && !vid.usingGL) {
|
||||||
|
int qty = s->w * s->h;
|
||||||
|
int *a = (int*) s->pixels;
|
||||||
|
int *b = (int*) aux->pixels;
|
||||||
|
SDL_LockSurface(aux);
|
||||||
|
while(qty) {
|
||||||
|
*a = ((*a) & 0xFF0000) | ((*b) & 0x00FFFF);
|
||||||
|
a++; b++; qty--;
|
||||||
|
}
|
||||||
|
SDL_UnlockSurface(aux);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void quickqueue() {
|
||||||
|
int siz = size(ptds);
|
||||||
|
setcameraangle(false);
|
||||||
|
for(int i=0; i<siz; i++) drawqueueitem(ptds[i]);
|
||||||
|
}
|
||||||
|
|
||||||
void drawqueue() {
|
void drawqueue() {
|
||||||
#ifdef USEPOLY
|
#ifdef USEPOLY
|
||||||
|
|
||||||
@ -490,71 +557,12 @@ void drawqueue() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for(int i=0; i<siz; i++) {
|
for(int i=0; i<siz; i++) {
|
||||||
|
|
||||||
#ifdef STLSORT
|
#ifdef STLSORT
|
||||||
polytodraw& ptd (ptds[i]);
|
polytodraw& ptd (ptds[i]);
|
||||||
#else
|
#else
|
||||||
polytodraw& ptd (*ptds2[i]);
|
polytodraw& ptd (*ptds2[i]);
|
||||||
#endif
|
#endif
|
||||||
|
drawqueueitem(ptd);
|
||||||
#ifdef ROGUEVIZ
|
|
||||||
svg::info = ptd.info;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// if(ptd.prio == 46) printf("eye size %d\n", polyi);
|
|
||||||
|
|
||||||
if(ptd.kind == pkResetModel) {
|
|
||||||
pmodel = eModel(ptd.col);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ptd.kind == pkPoly) {
|
|
||||||
if(ptd.u.poly.curveindex >= 0)
|
|
||||||
ptd.u.poly.tab = &curvedata[ptd.u.poly.curveindex];
|
|
||||||
drawpolyline(ptd.u.poly.V, ptd.u.poly.tab, ptd.u.poly.cnt, ptd.col, ptd.u.poly.outline);
|
|
||||||
}
|
|
||||||
else if(ptd.kind == pkLine) {
|
|
||||||
prettyline(ptd.u.line.H1, ptd.u.line.H2, ptd.col, ptd.u.line.prf);
|
|
||||||
}
|
|
||||||
else if(ptd.kind == pkString) {
|
|
||||||
qchr& q(ptd.u.chr);
|
|
||||||
#ifndef MOBILE
|
|
||||||
if(svg::in)
|
|
||||||
svg::text(q.x, q.y, q.size, q.str, q.frame, ptd.col, q.align);
|
|
||||||
else {
|
|
||||||
if(q.frame) {
|
|
||||||
displaystr(q.x-q.frame, q.y, q.shift, q.size, q.str, 0, q.align);
|
|
||||||
displaystr(q.x+q.frame, q.y, q.shift, q.size, q.str, 0, q.align);
|
|
||||||
displaystr(q.x, q.y-q.frame, q.shift, q.size, q.str, 0, q.align);
|
|
||||||
displaystr(q.x, q.y+q.frame, q.shift, q.size, q.str, 0, q.align);
|
|
||||||
}
|
|
||||||
displaystr(q.x, q.y, q.shift, q.size, q.str, ptd.col, q.align);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
displayfr(q.x, q.y, q.frame, q.size, q.str, ptd.col, q.align);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if(ptd.kind == pkCircle) {
|
|
||||||
#ifndef MOBILE
|
|
||||||
if(svg::in)
|
|
||||||
svg::circle(ptd.u.cir.x, ptd.u.cir.y, ptd.u.cir.size, ptd.col);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
drawCircle(ptd.u.cir.x, ptd.u.cir.y, ptd.u.cir.size, ptd.col);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef NOSDL
|
|
||||||
if(vid.goteyes && !vid.usingGL) {
|
|
||||||
int qty = s->w * s->h;
|
|
||||||
int *a = (int*) s->pixels;
|
|
||||||
int *b = (int*) aux->pixels;
|
|
||||||
SDL_LockSurface(aux);
|
|
||||||
while(qty) {
|
|
||||||
*a = ((*a) & 0xFF0000) | ((*b) & 0x00FFFF);
|
|
||||||
a++; b++; qty--;
|
|
||||||
}
|
|
||||||
SDL_UnlockSurface(aux);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vid.goteyes && vid.usingGL) selectEyeGL(0), selectEyeMask(0);
|
if(vid.goteyes && vid.usingGL) selectEyeGL(0), selectEyeMask(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user