sword:: accurate sword angles

This commit is contained in:
Zeno Rogue 2019-05-29 01:01:13 +02:00
parent 7a4ee025d8
commit 13a044154b
5 changed files with 31 additions and 14 deletions

View File

@ -2620,8 +2620,25 @@ namespace dragon {
} }
namespace sword { namespace sword {
int angle[MAXPLAYER]; array<int, MAXPLAYER> angle;
int sword_angles;
void possible_divisor(int s) { sword_angles *= s / gcd(sword_angles, s); }
void determine_sword_angles() {
sword_angles = 2;
if(IRREGULAR) sword_angles = 840;
else if(binarytiling) sword_angles = 42;
else if(archimedean) {
if(!PURE) possible_divisor((BITRUNCATED ? 2 : 1) * isize(arcm::current.faces));
if(!DUAL) for(int f: arcm::current.faces) possible_divisor(f);
}
else {
possible_divisor(S7);
if(BITRUNCATED) possible_divisor(S3);
}
}
cell *pos(cell *c, int s) { cell *pos(cell *c, int s) {
int t = c->type; int t = c->type;
s *= 2; s *= 2;

View File

@ -5264,8 +5264,8 @@ void sideAttack(cell *mf, int dir, eMonster who, int bonuskill) {
template<class T> void do_swords(cell *mf, cell *mt, eMonster who, const T& f) { template<class T> void do_swords(cell *mf, cell *mt, eMonster who, const T& f) {
for(int bb=0; bb<2; bb++) if(who == moPlayer && sword::orbcount(bb)) { for(int bb=0; bb<2; bb++) if(who == moPlayer && sword::orbcount(bb)) {
cell *sf = sword::pos(mf, sword::angle[multi::cpid] + (bb?sword_angles/2:0)); cell *sf = sword::pos(mf, sword::angle[multi::cpid] + (bb?sword::sword_angles/2:0));
cell *st = sword::pos(mt, sword::shift(mf, mt, sword::angle[multi::cpid]) + (bb?sword_angles/2:0)); cell *st = sword::pos(mt, sword::shift(mf, mt, sword::angle[multi::cpid]) + (bb?sword::sword_angles/2:0));
f(st, bb); f(st, bb);
if(sf != st && !isNeighbor(sf,st)) { if(sf != st && !isNeighbor(sf,st)) {
// also attack the in-transit cell // also attack the in-transit cell

View File

@ -383,35 +383,36 @@ void drawPlayerEffects(const transmatrix& V, cell *c, bool onplayer) {
else { else {
int& ang = angle[multi::cpid]; int& ang = angle[multi::cpid];
ang %= sword_angles; ang %= sword::sword_angles;
#if CAP_QUEUE || CAP_SHAPES #if CAP_QUEUE || CAP_SHAPES
transmatrix Vnow = gmatrix[c] * rgpushxto0(inverse(gmatrix[c]) * tC0(V)) * ddspin(c,0,M_PI); // (IRREGULAR ? ddspin(c,0,M_PI) : spin(-hexshiftat(c))); transmatrix Vnow = gmatrix[c] * rgpushxto0(inverse(gmatrix[c]) * tC0(V)) * ddspin(c,0,M_PI); // (IRREGULAR ? ddspin(c,0,M_PI) : spin(-hexshiftat(c)));
#endif #endif
int adj = 1 - ((sword_angles/cwt.at->type)&1);
#if CAP_QUEUE #if CAP_QUEUE
if(!euclid) for(int a=0; a<sword_angles; a++) { if(!euclid) for(int a=0; a<sword_angles; a++) {
int dda = sword_angles + (-1-2*a);
if(a == ang && items[itOrbSword]) continue; if(a == ang && items[itOrbSword]) continue;
if(PURE && a%3 != ang%3) continue;
if((a+sword_angles/2)%sword_angles == ang && items[itOrbSword2]) continue; if((a+sword_angles/2)%sword_angles == ang && items[itOrbSword2]) continue;
bool longer = sword::pos(cwt.at, a-1) != sword::pos(cwt.at, a+1); bool longer = sword::pos(cwt.at, a-1) != sword::pos(cwt.at, a+1);
if(sword_angles > 48 && !longer) continue;
color_t col = darkena(0xC0C0C0, 0, 0xFF); color_t col = darkena(0xC0C0C0, 0, 0xFF);
ld l0 = PURE ? 0.6 * cgi.scalefactor : longer ? 0.36 : 0.4; ld l0 = PURE ? 0.6 * cgi.scalefactor : longer ? 0.36 : 0.4;
ld l1 = PURE ? 0.7 * cgi.scalefactor : longer ? 0.44 : 0.42; ld l1 = PURE ? 0.7 * cgi.scalefactor : longer ? 0.44 : 0.42;
hyperpoint h0 = DIM == 3 ? xpush(l0) * zpush(cgi.FLOOR - cgi.human_height/50) * C0 : xpush0(l0); hyperpoint h0 = DIM == 3 ? xpush(l0) * zpush(cgi.FLOOR - cgi.human_height/50) * C0 : xpush0(l0);
hyperpoint h1 = DIM == 3 ? xpush(l1) * zpush(cgi.FLOOR - cgi.human_height/50) * C0 : xpush0(l1); hyperpoint h1 = DIM == 3 ? xpush(l1) * zpush(cgi.FLOOR - cgi.human_height/50) * C0 : xpush0(l1);
transmatrix T = Vnow*spin(dda * M_PI / sword_angles); transmatrix T = Vnow*spin((sword_angles + (-adj-2*a)) * M_PI / sword_angles);
queueline(T*h0, T*h1, col, 1, PPR::SUPERLINE); queueline(T*h0, T*h1, col, 1, PPR::SUPERLINE);
} }
#endif #endif
#if CAP_SHAPES #if CAP_SHAPES
if(items[itOrbSword]) if(items[itOrbSword])
queuepoly(Vnow*spin(M_PI+(-1-2*ang)*M_PI/sword_angles), (peace::on ? cgi.shMagicShovel : cgi.shMagicSword), darkena(iinf[itOrbSword].color, 0, 0x80 + 0x70 * sintick(200))); queuepoly(Vnow*spin(M_PI+(-adj-2*ang)*M_PI/sword_angles), (peace::on ? cgi.shMagicShovel : cgi.shMagicSword), darkena(iinf[itOrbSword].color, 0, 0x80 + 0x70 * sintick(200)));
if(items[itOrbSword2]) if(items[itOrbSword2])
queuepoly(Vnow*spin((-1-2*ang)*M_PI/sword_angles), (peace::on ? cgi.shMagicShovel : cgi.shMagicSword), darkena(iinf[itOrbSword2].color, 0, 0x80 + 0x70 * sintick(200))); queuepoly(Vnow*spin((-adj-2*ang)*M_PI/sword_angles), (peace::on ? cgi.shMagicShovel : cgi.shMagicSword), darkena(iinf[itOrbSword2].color, 0, 0x80 + 0x70 * sintick(200)));
#endif #endif
} }
} }

View File

@ -1833,11 +1833,9 @@ namespace tortoise {
int getRandomBits(); int getRandomBits();
} }
#define sword_angles (S7*S3*2)
namespace sword { namespace sword {
extern int angle[MAXPLAYER]; extern array<int, MAXPLAYER> angle;
cell *pos(cell *c, int s); cell *pos(cell *c, int s);
cell *pos(int id); cell *pos(int id);

View File

@ -208,7 +208,8 @@ void initgame() {
createMov(cwt.at, 0)->land = laCrossroads2; createMov(cwt.at, 0)->land = laCrossroads2;
} }
for(int i=0; i<numplayers(); i++) sword::angle[i] = PURE ? 10 : 11; sword::determine_sword_angles();
for(int i=0; i<numplayers(); i++) sword::angle[i] = (sword::sword_angles / cwt.at->type + 1) / 2;
#if CAP_DAILY #if CAP_DAILY
daily::split(); daily::split();