diff --git a/items.cpp b/items.cpp index bb0eb82d..a2fa649f 100644 --- a/items.cpp +++ b/items.cpp @@ -16,7 +16,12 @@ EX array items; EX map > hiitems; +EX bool pickable_from_water(eItem it) { + return among(it, itOrbFish, itOrbAether); + } + EX bool cannotPickupItem(cell *c, bool telekinesis) { + if(pickable_from_water(c->item) && isWatery(c)) return false; return itemHidden(c) && !telekinesis && !(isWatery(c) && markOrb(itOrbFish)); } @@ -737,7 +742,7 @@ EX void collectMessage(cell *c2, eItem which) { EX bool itemHiddenFromSight(cell *c) { return isWatery(c) && !items[itOrbInvis] && !(items[itOrbFish] && playerInWater()) - && !(shmup::on && shmup::boatAt(c)); + && !(shmup::on && shmup::boatAt(c)) && !(c->cpdist <= 1 && playerInWater()); } } diff --git a/passable.cpp b/passable.cpp index 94fbb4d6..a633dfea 100644 --- a/passable.cpp +++ b/passable.cpp @@ -258,7 +258,8 @@ EX bool passable(cell *w, cell *from, flagtype flags) { } if(isWatery(w)) { - if(in_gravity_zone(w)) ; + if((flags & P_ISPLAYER) && from && isWatery(from) && pickable_from_water(w->item)) ; + else if(in_gravity_zone(w)) ; else if(from && from->wall == waBoat && F(P_USEBOAT) && (!againstCurrent(w, from) || F(P_MARKWATER)) && !(from->item == itOrbYendor)) ; else if(from && isWatery(from) && F(P_CHAIN) && F(P_USEBOAT) && !againstCurrent(w, from)) ;