… | |
… | |
607 | { |
607 | { |
608 | tmp = present_arch_in_ob (at, this); |
608 | tmp = present_arch_in_ob (at, this); |
609 | |
609 | |
610 | if (!tmp) |
610 | if (!tmp) |
611 | { |
611 | { |
612 | tmp = arch_to_object (at); |
612 | tmp = at->instance (); |
613 | tmp = insert_ob_in_ob (tmp, this); |
613 | tmp = insert_ob_in_ob (tmp, this); |
614 | SET_FLAG (tmp, FLAG_APPLIED); |
614 | SET_FLAG (tmp, FLAG_APPLIED); |
615 | } |
615 | } |
616 | } |
616 | } |
617 | |
617 | |
… | |
… | |
637 | if (!tmp) |
637 | if (!tmp) |
638 | { |
638 | { |
639 | if (!value) |
639 | if (!value) |
640 | return; |
640 | return; |
641 | |
641 | |
642 | tmp = arch_to_object (at); |
642 | tmp = at->instance (); |
643 | tmp = insert_ob_in_ob (tmp, this); |
643 | tmp = insert_ob_in_ob (tmp, this); |
644 | SET_FLAG (tmp, FLAG_APPLIED); |
644 | SET_FLAG (tmp, FLAG_APPLIED); |
645 | } |
645 | } |
646 | |
646 | |
647 | if (value) |
647 | if (value) |
… | |
… | |
767 | int stat_sum [NUM_STATS]; |
767 | int stat_sum [NUM_STATS]; |
768 | |
768 | |
769 | /* First task is to clear all the values back to their original values */ |
769 | /* First task is to clear all the values back to their original values */ |
770 | if (type == PLAYER) |
770 | if (type == PLAYER) |
771 | { |
771 | { |
|
|
772 | contr->delayed_update = false; |
|
|
773 | |
772 | for (int i = 0; i < NUM_STATS; i++) |
774 | for (int i = 0; i < NUM_STATS; i++) |
773 | stat_sum [i] = contr->orig_stats.stat (i); |
775 | stat_sum [i] = contr->orig_stats.stat (i); |
774 | |
776 | |
775 | if (settings.spell_encumbrance == TRUE) |
777 | if (settings.spell_encumbrance == TRUE) |
776 | contr->encumbrance = 0; |
778 | contr->encumbrance = 0; |
… | |
… | |
909 | && !tmp->flag [FLAG_CURSED] |
911 | && !tmp->flag [FLAG_CURSED] |
910 | && !tmp->flag [FLAG_DAMNED]) |
912 | && !tmp->flag [FLAG_DAMNED]) |
911 | continue; |
913 | continue; |
912 | |
914 | |
913 | for (int i = 0; i < NUM_STATS; i++) |
915 | for (int i = 0; i < NUM_STATS; i++) |
914 | stat_sum [i] = stat_sum [i] + tmp->stats.stat (i); |
916 | stat_sum [i] += tmp->stats.stat (i); |
915 | |
917 | |
916 | if (digest_types [tmp->type]) |
918 | if (digest_types [tmp->type]) |
917 | { |
919 | { |
918 | contr->digestion += tmp->stats.food; |
920 | contr->digestion += tmp->stats.food; |
919 | contr->gen_hp += tmp->stats.hp; |
921 | contr->gen_hp += tmp->stats.hp; |
… | |
… | |
1172 | |
1174 | |
1173 | if (type == PLAYER) |
1175 | if (type == PLAYER) |
1174 | { |
1176 | { |
1175 | // clamp various player stats |
1177 | // clamp various player stats |
1176 | for (int i = 0; i < NUM_STATS; ++i) |
1178 | for (int i = 0; i < NUM_STATS; ++i) |
1177 | stats.stat (i) = clamp (stat_sum [i], MIN_STAT, MAX_STAT); |
1179 | stats.stat (i) = stat_sum [i]; |
|
|
1180 | |
|
|
1181 | check_stat_bounds (&stats); |
1178 | |
1182 | |
1179 | contr->digestion = clamp (contr->digestion, MIN_DIGESTION, MAX_DIGESTION); |
1183 | contr->digestion = clamp (contr->digestion, MIN_DIGESTION, MAX_DIGESTION); |
1180 | |
1184 | |
1181 | /* Figure out the players sp/mana/hp totals. */ |
1185 | /* Figure out the players sp/mana/hp totals. */ |
1182 | int pl_level; |
1186 | int pl_level; |
1183 | |
1187 | |
1184 | check_stat_bounds (&(stats)); |
|
|
1185 | pl_level = level; |
|
|
1186 | |
|
|
1187 | if (pl_level < 1) |
|
|
1188 | pl_level = 1; /* safety, we should always get 1 levels worth of hp! */ |
1188 | pl_level = max (1, level); /* safety, we should always get 1 levels worth of hp! */ |
1189 | |
1189 | |
1190 | /* You basically get half a con bonus/level. But we do take into account rounding, |
1190 | /* You basically get half a con bonus/level. But we do take into account rounding, |
1191 | * so if your bonus is 7, you still get 7 worth of bonus every 2 levels. |
1191 | * so if your bonus is 7, you still get 7 worth of bonus every 2 levels. |
1192 | */ |
1192 | */ |
1193 | stats.maxhp = 0; |
1193 | stats.maxhp = 0; |
… | |
… | |
1356 | speed *= speed_reduce_from_disease; |
1356 | speed *= speed_reduce_from_disease; |
1357 | |
1357 | |
1358 | /* Put a lower limit on speed. Note with this speed, you move once every |
1358 | /* Put a lower limit on speed. Note with this speed, you move once every |
1359 | * 25 ticks or so. This amounts to once every 3 seconds of realtime. |
1359 | * 25 ticks or so. This amounts to once every 3 seconds of realtime. |
1360 | */ |
1360 | */ |
1361 | if (speed < 0.04f && type == PLAYER) |
1361 | max_it (speed, is_player () ? MIN_PLAYER_SPEED : MIN_ACTIVE_SPEED); |
1362 | speed = 0.04f; |
|
|
1363 | |
1362 | |
1364 | if (speed != old_speed) |
1363 | if (speed != old_speed) |
1365 | set_speed (speed); |
1364 | set_speed (speed); |
1366 | |
1365 | |
1367 | if (type == PLAYER) |
1366 | if (type == PLAYER) |
… | |
… | |
1606 | { |
1605 | { |
1607 | changed = true; |
1606 | changed = true; |
1608 | |
1607 | |
1609 | op->level++; |
1608 | op->level++; |
1610 | |
1609 | |
1611 | if (op && op == who && op->stats.exp > 1 && is_dragon_pl (who)) |
1610 | if (op && op == who && op->stats.exp > 1 && who->is_dragon ()) |
1612 | dragon_level_gain (who); |
1611 | dragon_level_gain (who); |
1613 | |
1612 | |
1614 | /* Only roll these if it is the player (who) that gained the level */ |
1613 | /* Only roll these if it is the player (who) that gained the level */ |
1615 | if (op == who && (who->level < 11) && who->type == PLAYER) |
1614 | if (op == who && (who->level < 11) && who->type == PLAYER) |
1616 | { |
1615 | { |