1 | |
|
|
2 | /* |
|
|
3 | * static char *rcsid_init_c = |
|
|
4 | * "$Id: init.C,v 1.9 2006/09/10 15:59:57 root Exp $"; |
|
|
5 | */ |
|
|
6 | |
|
|
7 | /* |
1 | /* |
8 | CrossFire, A Multiplayer game for X-windows |
2 | CrossFire, A Multiplayer game for X-windows |
9 | |
3 | |
10 | Copyright (C) 2002 Mark Wedel & Crossfire Development Team |
4 | Copyright (C) 2002 Mark Wedel & Crossfire Development Team |
11 | Copyright (C) 1992 Frank Tore Johansen |
5 | Copyright (C) 1992 Frank Tore Johansen |
… | |
… | |
1196 | init_readable (); /* inits useful arrays for readable texts */ |
1190 | init_readable (); /* inits useful arrays for readable texts */ |
1197 | init_formulae (); /* If not called before, reads formulae from file */ |
1191 | init_formulae (); /* If not called before, reads formulae from file */ |
1198 | |
1192 | |
1199 | switch (settings.dumpvalues) |
1193 | switch (settings.dumpvalues) |
1200 | { |
1194 | { |
1201 | case 1: |
1195 | case 1: |
1202 | print_monsters (); |
1196 | print_monsters (); |
1203 | exit (0); |
1197 | exit (0); |
1204 | case 2: |
1198 | case 2: |
1205 | dump_abilities (); |
1199 | dump_abilities (); |
1206 | exit (0); |
1200 | exit (0); |
1207 | case 3: |
1201 | case 3: |
1208 | dump_artifacts (); |
1202 | dump_artifacts (); |
1209 | exit (0); |
1203 | exit (0); |
1210 | case 4: |
1204 | case 4: |
1211 | dump_spells (); |
1205 | dump_spells (); |
1212 | exit (0); |
1206 | exit (0); |
1213 | case 5: |
1207 | case 5: |
1214 | exit (0); |
1208 | exit (0); |
1215 | case 6: |
1209 | case 6: |
1216 | dump_races (); |
1210 | dump_races (); |
1217 | exit (0); |
1211 | exit (0); |
1218 | case 7: |
1212 | case 7: |
1219 | dump_alchemy (); |
1213 | dump_alchemy (); |
1220 | exit (0); |
1214 | exit (0); |
1221 | case 9: |
1215 | case 9: |
1222 | dump_alchemy_costs (); |
1216 | dump_alchemy_costs (); |
1223 | exit (0); |
1217 | exit (0); |
1224 | case 10: |
1218 | case 10: |
1225 | dump_monster_treasure (settings.dumparg); |
1219 | dump_monster_treasure (settings.dumparg); |
1226 | exit (0); |
1220 | exit (0); |
1227 | } |
1221 | } |
1228 | } |
1222 | } |
1229 | |
1223 | |
1230 | void |
1224 | void |
1231 | init_startup (void) |
1225 | init_startup (void) |
… | |
… | |
1418 | static int init_done = 0; |
1412 | static int init_done = 0; |
1419 | |
1413 | |
1420 | if (init_done) |
1414 | if (init_done) |
1421 | return; |
1415 | return; |
1422 | init_done = 1; |
1416 | init_done = 1; |
1423 | first_race = NULL; |
1417 | first_race = 0; |
1424 | |
1418 | |
1425 | sprintf (fname, "%s/races", settings.datadir); |
1419 | sprintf (fname, "%s/races", settings.datadir); |
1426 | LOG (llevDebug, "Reading races from %s...", fname); |
1420 | LOG (llevDebug, "Reading races from %s...", fname); |
1427 | if (!(file = fopen (fname, "r"))) |
1421 | if (!(file = fopen (fname, "r"))) |
1428 | { |
1422 | { |
… | |
… | |
1434 | { |
1428 | { |
1435 | int set_race = 1, set_list = 1; |
1429 | int set_race = 1, set_list = 1; |
1436 | |
1430 | |
1437 | if (*buf == '#') |
1431 | if (*buf == '#') |
1438 | continue; |
1432 | continue; |
|
|
1433 | |
1439 | if ((cp = strchr (buf, '\n')) != NULL) |
1434 | if ((cp = strchr (buf, '\n')) != NULL) |
1440 | *cp = '\0'; |
1435 | *cp = '\0'; |
|
|
1436 | |
1441 | cp = buf; |
1437 | cp = buf; |
1442 | while (*cp == ' ' || *cp == '!' || *cp == '@') |
1438 | while (*cp == ' ' || *cp == '!' || *cp == '@') |
1443 | { |
1439 | { |
1444 | if (*cp == '!') |
1440 | if (*cp == '!') |
1445 | set_race = 0; |
1441 | set_race = 0; |
1446 | if (*cp == '@') |
1442 | if (*cp == '@') |
1447 | set_list = 0; |
1443 | set_list = 0; |
1448 | cp++; |
1444 | cp++; |
1449 | } |
1445 | } |
|
|
1446 | |
1450 | if (sscanf (cp, "RACE %s", variable)) |
1447 | if (sscanf (cp, "RACE %s", variable)) |
1451 | { /* set new race value */ |
1448 | { /* set new race value */ |
1452 | strcpy (race, variable); |
1449 | strcpy (race, variable); |
1453 | } |
1450 | } |
1454 | else |
1451 | else |
… | |
… | |
1466 | break; |
1463 | break; |
1467 | } |
1464 | } |
1468 | |
1465 | |
1469 | if (cp[strlen (cp) - 1] == '\n') |
1466 | if (cp[strlen (cp) - 1] == '\n') |
1470 | cp[strlen (cp) - 1] = '\0'; |
1467 | cp[strlen (cp) - 1] = '\0'; |
|
|
1468 | |
1471 | /* set creature race to race value */ |
1469 | /* set creature race to race value */ |
1472 | if ((mon = find_archetype (cp)) == NULL) |
1470 | if ((mon = find_archetype (cp)) == NULL) |
1473 | LOG (llevError, "\nCreature %s in race file lacks archetype", cp); |
1471 | LOG (llevError, "\nCreature %s in race file lacks archetype", cp); |
1474 | else |
1472 | else |
1475 | { |
1473 | { |
1476 | if (set_race && (!mon->clone.race || strcmp (mon->clone.race, race))) |
1474 | if (set_race && (!mon->clone.race || strcmp (mon->clone.race, race))) |
1477 | { |
1475 | { |
1478 | if (mon->clone.race) |
1476 | if (mon->clone.race) |
1479 | { |
|
|
1480 | LOG (llevDebug, "\n Resetting race to %s from %s for archetype %s", race, &mon->clone.race, &mon->name); |
1477 | LOG (llevDebug, "\n Resetting race to %s from %s for archetype %s", race, &mon->clone.race, &mon->name); |
1481 | } |
1478 | |
1482 | mon->clone.race = race; |
1479 | mon->clone.race = race; |
1483 | } |
1480 | } |
|
|
1481 | |
1484 | /* if the arch is a monster, add it to the race list */ |
1482 | /* if the arch is a monster, add it to the race list */ |
1485 | if (set_list && QUERY_FLAG (&mon->clone, FLAG_MONSTER)) |
1483 | if (set_list && QUERY_FLAG (&mon->clone, FLAG_MONSTER)) |
1486 | add_to_racelist (race, &mon->clone); |
1484 | add_to_racelist (race, &mon->clone); |
1487 | } |
1485 | } |
1488 | } |
1486 | } |
1489 | } |
1487 | } |
|
|
1488 | |
1490 | fclose (file); |
1489 | fclose (file); |
1491 | LOG (llevDebug, "done.\n"); |
1490 | LOG (llevDebug, "done.\n"); |
1492 | } |
1491 | } |
1493 | |
1492 | |
1494 | void |
1493 | void |
… | |
… | |
1497 | racelink *list; |
1496 | racelink *list; |
1498 | objectlink *tmp; |
1497 | objectlink *tmp; |
1499 | |
1498 | |
1500 | for (list = first_race; list; list = list->next) |
1499 | for (list = first_race; list; list = list->next) |
1501 | { |
1500 | { |
1502 | fprintf (stderr, "\nRACE %s:\t", list->name); |
1501 | fprintf (stderr, "\nRACE %s:\t", &list->name); |
1503 | for (tmp = list->member; tmp; tmp = tmp->next) |
1502 | for (tmp = list->member; tmp; tmp = tmp->next) |
1504 | fprintf (stderr, "%s(%d), ", &tmp->ob->arch->name, tmp->ob->level); |
1503 | fprintf (stderr, "%s(%d), ", &tmp->ob->arch->name, tmp->ob->level); |
1505 | } |
1504 | } |
|
|
1505 | |
1506 | fprintf (stderr, "\n"); |
1506 | fprintf (stderr, "\n"); |
1507 | } |
1507 | } |
1508 | |
1508 | |
1509 | void |
1509 | void |
1510 | add_to_racelist (const char *race_name, object *op) |
1510 | add_to_racelist (const char *race_name, object *op) |
1511 | { |
1511 | { |
1512 | racelink *race; |
1512 | racelink *race; |
1513 | |
1513 | |
1514 | if (!op || !race_name) |
1514 | if (!op || !race_name) |
1515 | return; |
1515 | return; |
|
|
1516 | |
1516 | race = find_racelink (race_name); |
1517 | race = find_racelink (race_name); |
1517 | |
1518 | |
1518 | if (!race) |
1519 | if (!race) |
1519 | { /* add in a new race list */ |
1520 | { /* add in a new race list */ |
1520 | race = get_racelist (); |
1521 | race = get_racelist (); |
… | |
… | |
1528 | objectlink *tmp = get_objectlink (); |
1529 | objectlink *tmp = get_objectlink (); |
1529 | |
1530 | |
1530 | tmp->next = race->member; |
1531 | tmp->next = race->member; |
1531 | race->member = tmp; |
1532 | race->member = tmp; |
1532 | } |
1533 | } |
|
|
1534 | |
1533 | race->nrof++; |
1535 | race->nrof++; |
1534 | race->member->ob = op; |
1536 | race->member->ob = op; |
1535 | } |
1537 | } |
1536 | |
1538 | |
1537 | racelink * |
1539 | racelink * |
1538 | get_racelist () |
1540 | get_racelist () |
1539 | { |
1541 | { |
1540 | racelink *list; |
1542 | racelink *list = new racelink; |
1541 | |
1543 | |
1542 | list = (racelink *) malloc (sizeof (racelink)); |
|
|
1543 | list->name = NULL; |
1544 | list->name = 0; |
1544 | list->nrof = 0; |
1545 | list->nrof = 0; |
|
|
1546 | list->next = 0; |
1545 | list->member = get_objectlink (); |
1547 | list->member = get_objectlink (); |
1546 | list->next = NULL; |
|
|
1547 | |
1548 | |
1548 | return list; |
1549 | return list; |
1549 | } |
1550 | } |
1550 | |
1551 | |
1551 | racelink * |
1552 | racelink * |
1552 | find_racelink (const char *name) |
1553 | find_racelink (const char *name) |
1553 | { |
1554 | { |
1554 | racelink *test = NULL; |
1555 | if (name) |
1555 | |
1556 | for (racelink *link = first_race; link; link = link->next) |
1556 | if (name && first_race) |
|
|
1557 | for (test = first_race; test && test != test->next; test = test->next) |
|
|
1558 | if (!test->name || !strcmp (name, test->name)) |
1557 | if (!link->name || !strcmp (name, link->name)) |
1559 | break; |
1558 | return link; |
1560 | |
1559 | |
1561 | return test; |
1560 | return 0; |
1562 | } |
1561 | } |