… | |
… | |
3 | * |
3 | * |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team |
5 | * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Crossfire TRT is free software; you can redistribute it and/or modify it |
8 | * Crossfire TRT is free software: you can redistribute it and/or modify |
9 | * under the terms of the GNU General Public License as published by the Free |
9 | * it under the terms of the GNU General Public License as published by |
10 | * Software Foundation; either version 2 of the License, or (at your option) |
10 | * the Free Software Foundation, either version 3 of the License, or |
11 | * any later version. |
11 | * (at your option) any later version. |
12 | * |
12 | * |
13 | * This program is distributed in the hope that it will be useful, but |
13 | * This program is distributed in the hope that it will be useful, |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * for more details. |
16 | * GNU General Public License for more details. |
17 | * |
17 | * |
18 | * You should have received a copy of the GNU General Public License along |
18 | * You should have received a copy of the GNU General Public License |
19 | * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 |
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
20 | * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
21 | * |
20 | * |
22 | * The authors can be reached via e-mail to <crossfire@schmorp.de> |
21 | * The authors can be reached via e-mail to <crossfire@schmorp.de> |
23 | */ |
22 | */ |
24 | |
23 | |
25 | #include <cmath> |
24 | #include <cmath> |
… | |
… | |
855 | { |
854 | { |
856 | base = base - (base * settings.armor_speed_improvement) / 100; |
855 | base = base - (base * settings.armor_speed_improvement) / 100; |
857 | pow++; |
856 | pow++; |
858 | } |
857 | } |
859 | |
858 | |
860 | ARMOUR_SPEED (armour) = (ARMOUR_SPEED (&armour->arch->clone) * base) / 100; |
859 | ARMOUR_SPEED (armour) = (ARMOUR_SPEED (armour->arch) * base) / 100; |
861 | } |
860 | } |
862 | else |
861 | else |
863 | ARMOUR_SPEED (armour) = (ARMOUR_SPEED (&armour->arch->clone) * (100 + armour->magic * settings.armor_speed_improvement)) / 100; |
862 | ARMOUR_SPEED (armour) = (ARMOUR_SPEED (armour->arch) * (100 + armour->magic * settings.armor_speed_improvement)) / 100; |
864 | |
863 | |
865 | if (!settings.armor_weight_linear) |
864 | if (!settings.armor_weight_linear) |
866 | { |
865 | { |
867 | int base = 100; |
866 | int base = 100; |
868 | int pow = 0; |
867 | int pow = 0; |
… | |
… | |
871 | { |
870 | { |
872 | base = base - (base * settings.armor_weight_reduction) / 100; |
871 | base = base - (base * settings.armor_weight_reduction) / 100; |
873 | pow++; |
872 | pow++; |
874 | } |
873 | } |
875 | |
874 | |
876 | armour->weight = (armour->arch->clone.weight * base) / 100; |
875 | armour->weight = (armour->arch->weight * base) / 100; |
877 | } |
876 | } |
878 | else |
877 | else |
879 | armour->weight = (armour->arch->clone.weight * (100 - armour->magic * settings.armor_weight_reduction)) / 100; |
878 | armour->weight = (armour->arch->weight * (100 - armour->magic * settings.armor_weight_reduction)) / 100; |
880 | |
879 | |
881 | if (armour->weight <= 0) |
880 | if (armour->weight <= 0) |
882 | { |
881 | { |
883 | LOG (llevInfo, "Warning: enchanted armours can have negative weight\n."); |
882 | LOG (llevInfo, "Warning: enchanted armours can have negative weight\n."); |
884 | armour->weight = 1; |
883 | armour->weight = 1; |
885 | } |
884 | } |
886 | |
885 | |
887 | armour->item_power = get_power_from_ench (armour->arch->clone.item_power + armour->magic); |
886 | armour->item_power = get_power_from_ench (armour->arch->item_power + armour->magic); |
888 | |
887 | |
889 | if (op->type == PLAYER) |
888 | if (op->type == PLAYER) |
890 | { |
889 | { |
891 | esrv_send_item (op, armour); |
890 | esrv_send_item (op, armour); |
892 | if (QUERY_FLAG (armour, FLAG_APPLIED)) |
891 | if (QUERY_FLAG (armour, FLAG_APPLIED)) |
… | |
… | |
1245 | */ |
1244 | */ |
1246 | static void |
1245 | static void |
1247 | apply_sign (object *op, object *sign, int autoapply) |
1246 | apply_sign (object *op, object *sign, int autoapply) |
1248 | { |
1247 | { |
1249 | readable_message_type *msgType; |
1248 | readable_message_type *msgType; |
1250 | char newbuf[HUGE_BUF]; |
|
|
1251 | |
1249 | |
1252 | if (sign->msg == NULL) |
1250 | if (sign->msg == NULL) |
1253 | { |
1251 | { |
1254 | new_draw_info (NDI_UNIQUE, 0, op, "Nothing is written on it."); |
1252 | new_draw_info (NDI_UNIQUE, 0, op, "Nothing is written on it."); |
1255 | return; |
1253 | return; |
… | |
… | |
1276 | if (QUERY_FLAG (op, FLAG_BLIND) && !QUERY_FLAG (op, FLAG_WIZ) && !sign->move_on) |
1274 | if (QUERY_FLAG (op, FLAG_BLIND) && !QUERY_FLAG (op, FLAG_WIZ) && !sign->move_on) |
1277 | { |
1275 | { |
1278 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to read while blind."); |
1276 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to read while blind."); |
1279 | return; |
1277 | return; |
1280 | } |
1278 | } |
|
|
1279 | |
|
|
1280 | if (op->contr) |
|
|
1281 | if (client *ns = op->contr->ns) |
|
|
1282 | { |
1281 | msgType = get_readable_message_type (sign); |
1283 | msgType = get_readable_message_type (sign); |
|
|
1284 | |
|
|
1285 | if (ns->can_msg) |
|
|
1286 | ns->send_msg (NDI_NAVY, msgType->msgtype, &sign->msg); |
|
|
1287 | else |
|
|
1288 | { |
|
|
1289 | char newbuf[HUGE_BUF]; |
1282 | snprintf (newbuf, sizeof (newbuf), "%hhu %s", autoapply ? 1 : 0, &sign->msg); |
1290 | snprintf (newbuf, sizeof (newbuf), "%u %s", autoapply ? 1 : 0, &sign->msg); |
1283 | draw_ext_info (NDI_UNIQUE | NDI_NAVY, 0, op, msgType->message_type, msgType->message_subtype, newbuf, &sign->msg); |
1291 | draw_ext_info (NDI_UNIQUE | NDI_NAVY, 0, op, msgType->message_type, msgType->message_subtype, newbuf, &sign->msg); |
|
|
1292 | } |
|
|
1293 | } |
1284 | } |
1294 | } |
1285 | |
1295 | |
1286 | /** |
1296 | /** |
1287 | * 'victim' moves onto 'trap' |
1297 | * 'victim' moves onto 'trap' |
1288 | * 'victim' leaves 'trap' |
1298 | * 'victim' leaves 'trap' |
… | |
… | |
1314 | { |
1324 | { |
1315 | LOG (llevDebug, "WARNING: move_apply(): aborting recursion " |
1325 | LOG (llevDebug, "WARNING: move_apply(): aborting recursion " |
1316 | "[trap arch %s, name %s; victim arch %s, name %s]\n", &trap->arch->archname, &trap->name, &victim->arch->archname, &victim->name); |
1326 | "[trap arch %s, name %s; victim arch %s, name %s]\n", &trap->arch->archname, &trap->name, &victim->arch->archname, &victim->name); |
1317 | return; |
1327 | return; |
1318 | } |
1328 | } |
|
|
1329 | |
1319 | recursion_depth++; |
1330 | recursion_depth++; |
1320 | if (trap->head) |
1331 | if (trap->head) |
1321 | trap = trap->head; |
1332 | trap = trap->head; |
1322 | |
1333 | |
1323 | if (INVOKE_OBJECT (MOVE_TRIGGER, trap, ARG_OBJECT (victim), ARG_OBJECT (originator))) |
1334 | if (INVOKE_OBJECT (MOVE_TRIGGER, trap, ARG_OBJECT (victim), ARG_OBJECT (originator))) |
… | |
… | |
1540 | if (QUERY_FLAG (op, FLAG_BLIND) && !QUERY_FLAG (op, FLAG_WIZ)) |
1551 | if (QUERY_FLAG (op, FLAG_BLIND) && !QUERY_FLAG (op, FLAG_WIZ)) |
1541 | { |
1552 | { |
1542 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to read while blind."); |
1553 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to read while blind."); |
1543 | return; |
1554 | return; |
1544 | } |
1555 | } |
|
|
1556 | |
1545 | if (tmp->msg == NULL) |
1557 | if (!tmp->msg) |
1546 | { |
1558 | { |
1547 | new_draw_info_format (NDI_UNIQUE, 0, op, "You open the %s and find it empty.", &tmp->name); |
1559 | new_draw_info_format (NDI_UNIQUE, 0, op, "You open the %s and find it empty.", &tmp->name); |
1548 | return; |
1560 | return; |
1549 | } |
1561 | } |
1550 | |
1562 | |
… | |
… | |
1553 | if (!skill_ob) |
1565 | if (!skill_ob) |
1554 | { |
1566 | { |
1555 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to decipher the strange symbols."); |
1567 | new_draw_info (NDI_UNIQUE, 0, op, "You are unable to decipher the strange symbols."); |
1556 | return; |
1568 | return; |
1557 | } |
1569 | } |
|
|
1570 | |
1558 | lev_diff = tmp->level - (skill_ob->level + 5); |
1571 | lev_diff = tmp->level - (skill_ob->level + 5); |
1559 | if (!QUERY_FLAG (op, FLAG_WIZ) && lev_diff > 0) |
1572 | if (!QUERY_FLAG (op, FLAG_WIZ) && lev_diff > 0) |
1560 | { |
1573 | { |
1561 | if (lev_diff < 2) |
1574 | if (lev_diff < 2) |
1562 | new_draw_info (NDI_UNIQUE, 0, op, "This book is just barely beyond your comprehension."); |
1575 | new_draw_info (NDI_UNIQUE, 0, op, "This book is just barely beyond your comprehension."); |
… | |
… | |
1573 | return; |
1586 | return; |
1574 | } |
1587 | } |
1575 | |
1588 | |
1576 | readable_message_type *msgType = get_readable_message_type (tmp); |
1589 | readable_message_type *msgType = get_readable_message_type (tmp); |
1577 | |
1590 | |
|
|
1591 | if (player *pl = op->contr) |
|
|
1592 | if (client *ns = pl->ns) |
|
|
1593 | if (ns->can_msg) |
|
|
1594 | { |
|
|
1595 | dynbuf_text buf; |
|
|
1596 | buf << long_desc (tmp, op) |
|
|
1597 | << "\n\n" |
|
|
1598 | << tmp->msg |
|
|
1599 | << '\0'; |
|
|
1600 | ns->send_msg (NDI_NAVY, msgType->msgtype, buf.linearise ()); |
|
|
1601 | } |
|
|
1602 | else |
1578 | draw_ext_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, |
1603 | draw_ext_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, |
1579 | msgType->message_type, msgType->message_subtype, |
1604 | msgType->message_type, msgType->message_subtype, |
1580 | "You open the %s and start reading.\n%s", (char *)"%s\n%s", |
1605 | "You open the %s and start reading.\n%s", (char *)"%s\n%s", |
1581 | long_desc (tmp, op), &tmp->msg); |
1606 | long_desc (tmp, op), &tmp->msg); |
1582 | |
1607 | |
1583 | /* gain xp from reading */ |
1608 | /* gain xp from reading */ |
1584 | if (!QUERY_FLAG (tmp, FLAG_NO_SKILL_IDENT)) |
1609 | if (!QUERY_FLAG (tmp, FLAG_NO_SKILL_IDENT)) |
1585 | { /* only if not read before */ |
1610 | { /* only if not read before */ |
1586 | int exp_gain = calc_skill_exp (op, tmp, skill_ob); |
1611 | int exp_gain = calc_skill_exp (op, tmp, skill_ob); |
… | |
… | |
2022 | if (meal->type != FLESH || !is_dragon_pl (op)) |
2047 | if (meal->type != FLESH || !is_dragon_pl (op)) |
2023 | return 0; |
2048 | return 0; |
2024 | |
2049 | |
2025 | /* now grab the 'dragon_skin'- and 'dragon_ability'-forces |
2050 | /* now grab the 'dragon_skin'- and 'dragon_ability'-forces |
2026 | from the player's inventory */ |
2051 | from the player's inventory */ |
2027 | shstr_cmp dragon_ability_force ("dragon_ability_force"); |
|
|
2028 | shstr_cmp dragon_skin_force ("dragon_skin_force"); |
|
|
2029 | |
|
|
2030 | for (tmp = op->inv; tmp; tmp = tmp->below) |
2052 | for (tmp = op->inv; tmp; tmp = tmp->below) |
2031 | if (tmp->type == FORCE) |
2053 | if (tmp->type == FORCE) |
2032 | if (tmp->arch->archname == dragon_skin_force) |
2054 | if (tmp->arch->archname == shstr_dragon_skin_force) |
2033 | skin = tmp; |
2055 | skin = tmp; |
2034 | else if (tmp->arch->archname == dragon_ability_force) |
2056 | else if (tmp->arch->archname == shstr_dragon_ability_force) |
2035 | abil = tmp; |
2057 | abil = tmp; |
2036 | |
2058 | |
2037 | /* if either skin or ability are missing, this is an old player |
2059 | /* if either skin or ability are missing, this is an old player |
2038 | which is not to be considered a dragon -> bail out */ |
2060 | which is not to be considered a dragon -> bail out */ |
2039 | if (skin == NULL || abil == NULL) |
2061 | if (skin == NULL || abil == NULL) |
… | |
… | |
3846 | */ |
3868 | */ |
3847 | int i, j; |
3869 | int i, j; |
3848 | |
3870 | |
3849 | for (i = 0; i < NUM_STATS; i++) |
3871 | for (i = 0; i < NUM_STATS; i++) |
3850 | { |
3872 | { |
3851 | int race_bonus = pl->arch->clone.stats.stat (i); |
3873 | int race_bonus = pl->arch->stats.stat (i); |
3852 | sint8 stat = stats->stat (i) + ns->stat (i); |
3874 | sint8 stat = stats->stat (i) + ns->stat (i); |
3853 | |
3875 | |
3854 | if (stat > 20 + race_bonus) |
3876 | if (stat > 20 + race_bonus) |
3855 | { |
3877 | { |
3856 | excess_stat++; |
3878 | excess_stat++; |
… | |
… | |
3866 | |
3888 | |
3867 | if (i == CHA) |
3889 | if (i == CHA) |
3868 | continue; /* exclude cha from this */ |
3890 | continue; /* exclude cha from this */ |
3869 | |
3891 | |
3870 | int stat = stats->stat (i); |
3892 | int stat = stats->stat (i); |
3871 | int race_bonus = pl->arch->clone.stats.stat (i); |
3893 | int race_bonus = pl->arch->stats.stat (i); |
3872 | if (stat < 20 + race_bonus) |
3894 | if (stat < 20 + race_bonus) |
3873 | { |
3895 | { |
3874 | change_attr_value (stats, i, 1); |
3896 | change_attr_value (stats, i, 1); |
3875 | excess_stat--; |
3897 | excess_stat--; |
3876 | } |
3898 | } |