1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-08-28 08:22:18 +00:00

ru:: detect cross

This commit is contained in:
Zeno Rogue 2025-08-01 01:19:59 +02:00
parent 747d142e46
commit 9311342e31
4 changed files with 38 additions and 3 deletions

View File

@ -297,7 +297,7 @@ struct entity {
struct statdata {
statarray<ld> stats;
int jump_control, coyote_time, hallucinating;
ld detect_area;
ld detect_area, detect_cross;
void reset();
vector<tuple<power*, mod, int>> mods;
};

View File

@ -42,6 +42,7 @@ void statdata::reset() {
coyote_time = 0;
jump_control = 0;
detect_area = 0;
detect_cross = 0;
hallucinating = false;
mods.clear();
}
@ -87,8 +88,23 @@ void man::act() {
}
bool man::can_see(entity& e) {
ld d = hdist(to_hyper(m.where), to_hyper(e.where));
return d < inverse_wvolarea_auto(m.current.detect_area);
if(m.current.detect_area) {
ld d = hdist(to_hyper(m.where), to_hyper(e.where));
if(d < inverse_wvolarea_auto(m.current.detect_area)) return true;
}
if(m.current.detect_cross) {
array<int, 4> ar;
transmatrix T = iso_inverse(eupush(to_hyper(m.where)));
auto bb = e.get_pixel_bbox();
for(int u=0; u<4; u++) {
xy vertex = { ld((u&1) ? bb.minx : bb.maxx), ld((u&2) ? bb.miny : bb.maxy) };
hyperpoint h = T * to_hyper(vertex);
ar[u] = (h[0] > 0 ? 1 : 0) + (h[1] > 0 ? 2 : 0);
if(hdist0(h) > m.next.detect_cross) ar[u] = 4;
}
if(ar[0] != ar[1] || ar[0] != ar[2] || ar[0] != ar[3]) return true;
}
return false;
}
void man::on_kill() {

View File

@ -45,6 +45,10 @@ randeff trap_detect("Detect traps", "Lets you see traps and secret passages in a
}
});
randeff trap_detect_cross("Detect cross", "Lets you see traps and secret passages in a cross around you.", "You see things you could not see before!", [] (data &d) {
m.next.detect_cross = m.current.detect_cross + 0.01 / game_fps * m.current.stats[stat::wis];
});
randeff trap_snake("Snake Hair", "Lets you create snakes that can be used to disarm traps and secret passages.", "You grow snakes on your head!", [] (data &d) { });
randeff trap_disarm("Disarm traps", "Lets you see all traps on the level for a short time, and to attack them with your [weapon] to destroy them.", "You suddenly feel able to disarm traps with your [weapon]!", [] (data &d) { });

View File

@ -272,6 +272,21 @@ void man::draw() {
}
queuecurve(scrm, 0x800080, 0, PPR::LINE);
}
if(m.current.detect_cross > 0) for(int d: {0, 1, 2, 3}) {
transmatrix T = eupush(to_hyper(m.where)) * spin(90._deg * d);
ld dist = 0;
while(dist < m.current.detect_cross) {
dist += 0.01;
auto h = from_hyper(T * xpush0(dist));
curvepoint(eupush(h.x, h.y) * C0);
int cx = int(h.x / block_x);
int cy = int(h.y / block_y);
if(cx < 0 || cy < 0 || cx >= room_x || cy >= room_y) break;
if(!(walls[current_room->at(cx, cy)].flags & W_TRANS)) break;
}
queuecurve(scrm, 0x800080, 0, PPR::LINE);
}
}
void render_room_objects(room *r) {