mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-25 22:52:49 +00:00
ru:: a better implementation of next/current stats
This commit is contained in:
parent
1c4746d6d0
commit
131206f1e5
@ -260,31 +260,36 @@ struct entity {
|
|||||||
virtual string get_help() { return "No help about this."; }
|
virtual string get_help() { return "No help about this."; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct statdata {
|
||||||
|
statarray<int> stats;
|
||||||
|
int jump_control, coyote_time, hallucinating;
|
||||||
|
void reset();
|
||||||
|
};
|
||||||
|
|
||||||
struct man : public entity {
|
struct man : public entity {
|
||||||
int facing;
|
int facing;
|
||||||
int attack_facing;
|
int attack_facing;
|
||||||
int attack_when;
|
int attack_when;
|
||||||
|
|
||||||
int on_floor_when;
|
int on_floor_when;
|
||||||
int jump_control, next_jump_control;
|
|
||||||
int coyote_time, next_coyote_time;
|
|
||||||
|
|
||||||
int last_action;
|
int last_action;
|
||||||
|
|
||||||
int experience;
|
int experience;
|
||||||
statarray<int> base_stats, current_stats, next_stats;
|
|
||||||
|
|
||||||
virtual int max_hp() { return 10 * current_stats[stat::con]; }
|
statarray<int> base_stats;
|
||||||
|
statdata current, next;
|
||||||
|
|
||||||
|
virtual int max_hp() { return 10 * current.stats[stat::con]; }
|
||||||
|
|
||||||
man() {
|
man() {
|
||||||
facing = 1; attack_facing = 1;
|
facing = 1; attack_facing = 1;
|
||||||
for(auto s: allstats) base_stats[s] = 10;
|
for(auto s: allstats) base_stats[s] = 10;
|
||||||
next_stats = base_stats; current_stats = base_stats;
|
next.reset(); current.reset();
|
||||||
postfix();
|
postfix();
|
||||||
}
|
}
|
||||||
xy siz() override { return {12, 12}; }
|
xy siz() override { return {12, 12}; }
|
||||||
string glyph() override { return hallucinating ? "f" : "@"; }
|
string glyph() override { return "@"; }
|
||||||
color_t color() override { return hallucinating ? 0x808080FF : 0xFF8080FF; }
|
color_t color() override { return 0xFF8080FF; }
|
||||||
void act() override;
|
void act() override;
|
||||||
void draw() override;
|
void draw() override;
|
||||||
virtual bool hurt_by_spikes() { return true; }
|
virtual bool hurt_by_spikes() { return true; }
|
||||||
|
@ -99,8 +99,6 @@ ruwall walls[qwall] = {
|
|||||||
|
|
||||||
int sel = 1;
|
int sel = 1;
|
||||||
|
|
||||||
bool hallucinating;
|
|
||||||
|
|
||||||
template<class T> bool in_range(T val, T minv, T maxv) { return val >= minv && val <= maxv; }
|
template<class T> bool in_range(T val, T minv, T maxv) { return val >= minv && val <= maxv; }
|
||||||
|
|
||||||
map<cell*, struct room> rooms;
|
map<cell*, struct room> rooms;
|
||||||
|
@ -37,6 +37,12 @@ void check_fountains() {
|
|||||||
swap(on_fountain, next_on_fountain);
|
swap(on_fountain, next_on_fountain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void statdata::reset() {
|
||||||
|
stats = m.base_stats;
|
||||||
|
coyote_time = 0;
|
||||||
|
jump_control = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void man::act() {
|
void man::act() {
|
||||||
kino();
|
kino();
|
||||||
|
|
||||||
@ -45,20 +51,17 @@ void man::act() {
|
|||||||
stable_where = where;
|
stable_where = where;
|
||||||
}
|
}
|
||||||
|
|
||||||
current_stats = next_stats;
|
current = next;
|
||||||
next_stats = base_stats;
|
next.reset();
|
||||||
auto dat = get_dat();
|
auto dat = get_dat();
|
||||||
|
|
||||||
coyote_time = next_coyote_time; next_coyote_time = 0;
|
|
||||||
jump_control = next_jump_control; next_jump_control = 0;
|
|
||||||
|
|
||||||
if(on_floor) on_floor_when = gframeid;
|
if(on_floor) on_floor_when = gframeid;
|
||||||
|
|
||||||
fallthru = false;
|
fallthru = false;
|
||||||
|
|
||||||
handle_powers(dat);
|
handle_powers(dat);
|
||||||
|
|
||||||
if((on_floor || jump_control || wallhug) && !on_ice) {
|
if((on_floor || current.jump_control || wallhug) && !on_ice) {
|
||||||
vel.x = zero_vel.x + dat.dx * dat.d * dat.modv * 2.5;
|
vel.x = zero_vel.x + dat.dx * dat.d * dat.modv * 2.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ void gen_powers() {
|
|||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.keystate & 1) {
|
if(d.keystate & 1) {
|
||||||
bool can_jump = m.on_floor;
|
bool can_jump = m.on_floor;
|
||||||
if(gframeid <= m.on_floor_when + m.coyote_time) can_jump = true;
|
if(gframeid <= m.on_floor_when + m.current.coyote_time) can_jump = true;
|
||||||
if(can_jump) m.vel.y = m.zero_vel.y-(non_hyperbolic ? 3 : 5) * d.d * d.modv, m.on_floor_when = -1000;
|
if(can_jump) m.vel.y = m.zero_vel.y-(non_hyperbolic ? 3 : 5) * d.d * d.modv, m.on_floor_when = -1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -265,7 +265,7 @@ void gen_powers() {
|
|||||||
m.attack_facing = m.facing; m.attack_when = gframeid;
|
m.attack_facing = m.facing; m.attack_when = gframeid;
|
||||||
auto pb = m.get_pixel_bbox_at(xy{m.where.x + m.attack_facing * m.dsiz().x, m.where.y});
|
auto pb = m.get_pixel_bbox_at(xy{m.where.x + m.attack_facing * m.dsiz().x, m.where.y});
|
||||||
auto bb = pixel_to_block(pb);
|
auto bb = pixel_to_block(pb);
|
||||||
for(auto& e: current_room->entities) if(e->existing && intersect(e->get_pixel_bbox(), pb)) e->attacked((m.current_stats[stat::str] + 1) * 3 / 2);
|
for(auto& e: current_room->entities) if(e->existing && intersect(e->get_pixel_bbox(), pb)) e->attacked((m.current.stats[stat::str] + 1) * 3 / 2);
|
||||||
for(int y=bb.miny; y<bb.maxy; y++)
|
for(int y=bb.miny; y<bb.maxy; y++)
|
||||||
for(int x=bb.minx; x<bb.maxx; x++) {
|
for(int x=bb.minx; x<bb.maxx; x++) {
|
||||||
int b = current_room->at(x, y);
|
int b = current_room->at(x, y);
|
||||||
@ -304,8 +304,8 @@ void gen_powers() {
|
|||||||
"This strange ring is too small to put on your finger, but maybe you could put it on your small toe?",
|
"This strange ring is too small to put on your finger, but maybe you could put it on your small toe?",
|
||||||
"=", 0xe1cbbeFF,
|
"=", 0xe1cbbeFF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) m.next_coyote_time += 30;
|
if(d.p->flags & ACTIVE) m.next.coyote_time += 30;
|
||||||
if(!(d.p->flags & IDENTIFIED) && (gframeid <= m.on_floor_when + m.coyote_time) && !m.on_floor && (d.p->flags & ACTIVE)) {
|
if(!(d.p->flags & IDENTIFIED) && (gframeid <= m.on_floor_when + m.current.coyote_time) && !m.on_floor && (d.p->flags & ACTIVE)) {
|
||||||
d.p->flags |= IDENTIFIED;
|
d.p->flags |= IDENTIFIED;
|
||||||
addMessage("You feel a strange magical force wanting to hold your foot from below.");
|
addMessage("You feel a strange magical force wanting to hold your foot from below.");
|
||||||
}
|
}
|
||||||
@ -318,7 +318,7 @@ void gen_powers() {
|
|||||||
"=", 0xFFD500FF,
|
"=", 0xFFD500FF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) {
|
if(d.p->flags & ACTIVE) {
|
||||||
m.next_jump_control++;
|
m.next.jump_control++;
|
||||||
auto& ids = d.p->id_status;
|
auto& ids = d.p->id_status;
|
||||||
bool id_up = (!!m.on_floor) == !!(ids & 1);
|
bool id_up = (!!m.on_floor) == !!(ids & 1);
|
||||||
if(id_up) {
|
if(id_up) {
|
||||||
@ -350,7 +350,7 @@ void gen_powers() {
|
|||||||
"=", 0xC04040FF,
|
"=", 0xC04040FF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) {
|
if(d.p->flags & ACTIVE) {
|
||||||
m.next_stats[stat::str] += d.p->qty_filled;
|
m.next.stats[stat::str] += d.p->qty_filled;
|
||||||
d.p->flags |= IDENTIFIED;
|
d.p->flags |= IDENTIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -362,7 +362,7 @@ void gen_powers() {
|
|||||||
"=", 0xC04040FF,
|
"=", 0xC04040FF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) {
|
if(d.p->flags & ACTIVE) {
|
||||||
m.next_stats[stat::str] += d.p->qty_filled;
|
m.next.stats[stat::str] += d.p->qty_filled;
|
||||||
d.p->flags |= IDENTIFIED;
|
d.p->flags |= IDENTIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -374,7 +374,7 @@ void gen_powers() {
|
|||||||
"=", 0xC04040FF,
|
"=", 0xC04040FF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) {
|
if(d.p->flags & ACTIVE) {
|
||||||
m.next_stats[stat::str] += d.p->qty_filled;
|
m.next.stats[stat::str] += d.p->qty_filled;
|
||||||
d.p->flags |= IDENTIFIED;
|
d.p->flags |= IDENTIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -386,7 +386,7 @@ void gen_powers() {
|
|||||||
"=", 0xC04040FF,
|
"=", 0xC04040FF,
|
||||||
[] (data& d) {
|
[] (data& d) {
|
||||||
if(d.p->flags & ACTIVE) {
|
if(d.p->flags & ACTIVE) {
|
||||||
m.next_stats[stat::str] += d.p->qty_filled;
|
m.next.stats[stat::str] += d.p->qty_filled;
|
||||||
d.p->flags |= IDENTIFIED;
|
d.p->flags |= IDENTIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -420,7 +420,7 @@ void add_platf_hooks() {
|
|||||||
|
|
||||||
ld tscale = 1;
|
ld tscale = 1;
|
||||||
if(dexmode->flags & ACTIVE)
|
if(dexmode->flags & ACTIVE)
|
||||||
tscale *= 10. / (10 + m.current_stats[stat::dex]);
|
tscale *= 10. / (10 + m.current.stats[stat::dex]);
|
||||||
|
|
||||||
gtime += d * tscale;
|
gtime += d * tscale;
|
||||||
while(gtime > 1000. / game_fps) {
|
while(gtime > 1000. / game_fps) {
|
||||||
|
@ -23,7 +23,7 @@ void draw_stats() {
|
|||||||
|
|
||||||
for(auto st: allstats) {
|
for(auto st: allstats) {
|
||||||
string s = its(m.base_stats[st]);
|
string s = its(m.base_stats[st]);
|
||||||
if(m.current_stats[st] != m.base_stats[st]) s += " (" + its(m.current_stats[st]) + ")";
|
if(m.current.stats[st] != m.base_stats[st]) s += " (" + its(m.current.stats[st]) + ")";
|
||||||
dialog::addSelItem(statdata[st].name, s, statdata[st].key);
|
dialog::addSelItem(statdata[st].name, s, statdata[st].key);
|
||||||
dialog::add_action_push([st] {
|
dialog::add_action_push([st] {
|
||||||
render_the_map();
|
render_the_map();
|
||||||
@ -32,7 +32,7 @@ void draw_stats() {
|
|||||||
dialog::addHelp(statdata[st].desc);
|
dialog::addHelp(statdata[st].desc);
|
||||||
dialog::addBreak(100);
|
dialog::addBreak(100);
|
||||||
dialog::addSelItem("base value", its(m.base_stats[st]), 0);
|
dialog::addSelItem("base value", its(m.base_stats[st]), 0);
|
||||||
dialog::addSelItem("current value", its(m.current_stats[st]), 0);
|
dialog::addSelItem("current value", its(m.current.stats[st]), 0);
|
||||||
dialog::addBreak(100);
|
dialog::addBreak(100);
|
||||||
dialog::addBack();
|
dialog::addBack();
|
||||||
dialog::display();
|
dialog::display();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user