1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-10-15 14:27:37 +00:00

more fixes to multiplayer

This commit is contained in:
Zeno Rogue
2021-03-06 11:46:13 +01:00
parent 032a6b6df2
commit 40d450676e
15 changed files with 97 additions and 92 deletions

View File

@@ -324,8 +324,8 @@ bool pcmove::after_move() {
invisfish = false;
if(items[itOrbFish]) {
invisfish = true;
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i) && !isWatery(playerpos(i)))
for(cell *pc: player_positions())
if(!isWatery(pc))
invisfish = false;
if(d < 0) invisfish = false; // no invisibility if staying still
if(invisfish) invismove = true, markOrb(itOrbFish);
@@ -1193,8 +1193,8 @@ EX bool warningprotection_hit(eMonster m) {
}
EX bool playerInWater() {
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i) && isWatery(playerpos(i)) && !playerInBoat(i))
for(int i: player_indices())
if(isWatery(playerpos(i)) && !playerInBoat(i))
return true;
return false;
}
@@ -1203,6 +1203,22 @@ EX int numplayers() {
return multi::players;
}
EX vector<cell*> player_positions() {
vector<cell*> res;
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i))
res.push_back(playerpos(i));
return res;
}
EX vector<int> player_indices() {
vector<int> res;
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i))
res.push_back(i);
return res;
}
EX cell *playerpos(int i) {
if(shmup::on) return shmup::playerpos(i);
if(multi::players > 1) return multi::player[i].at;
@@ -1210,14 +1226,14 @@ EX cell *playerpos(int i) {
}
EX bool allPlayersInBoats() {
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i) && playerpos(i)->wall != waBoat) return true;
for(cell *pc: player_positions())
if(pc->wall != waBoat) return true;
return false;
}
EX int whichPlayerOn(cell *c) {
if(singleused()) return c == singlepos() ? 0 : -1;
for(int i=0; i<numplayers(); i++)
for(int i: player_indices())
if(playerpos(i) == c) return i;
return -1;
}
@@ -1245,8 +1261,8 @@ EX bool isPlayerInBoatOn(cell *c) {
EX bool playerInPower() {
if(singleused())
return singlepos()->land == laPower || singlepos()->land == laHalloween;
for(int i=0; i<numplayers(); i++)
if(multi::playerActive(i) && (playerpos(i)->land == laPower || playerpos(i)->land == laHalloween))
for(cell *pc: player_positions())
if(pc->land == laPower || pc->land == laHalloween)
return true;
return false;
}