OSDN Git Service

summon_specific() や、place_monster()等の仕様変更。
[hengbandforosx/hengbandosx.git] / src / wizard2.c
index bf1a9c9..de66e60 100644 (file)
@@ -185,18 +185,19 @@ static void prt_binary(u32b flags, int row, int col)
 }
 
 
+#define K_MAX_DEPTH 110
+
 /*
  * Output a rarity graph for a type of object.
  */
 static void prt_alloc(byte tval, byte sval, int row, int col)
 {
        int i, j;
-       int lev;
        int home = 0;
-       u32b maxd = 1, maxr = 1, maxt = 1;
-       u32b rarity[MAX_DEPTH];
-       u32b total[MAX_DEPTH];
-       u32b display[20];
+       u32b maxr = 1, maxt = 1, ratio;
+       u32b rarity[K_MAX_DEPTH];
+       u32b total[K_MAX_DEPTH];
+       s32b maxd = 1, display[22];
        byte c = TERM_WHITE;
        cptr r = "+--common--+";
        object_kind *k_ptr;
@@ -206,89 +207,114 @@ static void prt_alloc(byte tval, byte sval, int row, int col)
        alloc_entry *table = alloc_kind_table;
 
        /* Wipe the tables */
-       (void)C_WIPE(rarity, MAX_DEPTH, u32b);
-       (void)C_WIPE(total, MAX_DEPTH, u32b);
-       (void)C_WIPE(display, 20, u32b);
+       (void)C_WIPE(rarity, K_MAX_DEPTH, u32b);
+       (void)C_WIPE(total, K_MAX_DEPTH, u32b);
+       (void)C_WIPE(display, 22, s32b);
 
        /* Scan all entries */
-       for (i = 0; i < MAX_DEPTH; i++)
+       for (i = 0; i < K_MAX_DEPTH; i++)
        {
-               /* Base level */
-               lev = ((i * (GREAT_OBJ - 1)) + (1 + i * 5433L / 1000)) / GREAT_OBJ;
-
+               int total_frac = 0;
                for (j = 0; j < alloc_kind_size; j++)
                {
-                       /* Objects are sorted by depth */
-                       if (table[j].level > lev) break;
+                       int prob = 0;
+
+                       if (table[j].level <= i)
+                       {
+                               prob = table[j].prob1 * GREAT_OBJ * K_MAX_DEPTH;
+                       }
+                       else if (table[j].level - 1 > 0)
+                       {
+                               prob = table[j].prob1 * i * K_MAX_DEPTH / (table[j].level - 1);
+                       }
 
                        /* Acquire this kind */
                        k_ptr = &k_info[table[j].index];
 
                        /* Accumulate probabilities */
-                       total[i] += table[j].prob1;
+                       total[i] += prob / (GREAT_OBJ * K_MAX_DEPTH);
+                       total_frac += prob % (GREAT_OBJ * K_MAX_DEPTH);
 
                        /* Accumulate probabilities */
                        if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
                        {
                                home = k_ptr->level;
-                               rarity[i] += table[j].prob1;
+                               rarity[i] += prob;
                        }
                }
+               total[i] += total_frac / (GREAT_OBJ * K_MAX_DEPTH);
        }
 
        /* Find maxima */
-       for (i = 0; i < MAX_DEPTH; i++)
+       for (i = 0; i < K_MAX_DEPTH; i++)
        {
                if (rarity[i] > maxr) maxr = rarity[i];
                if (total[i] > maxt) maxt = total[i];
        }
 
+       if (maxr / (GREAT_OBJ * K_MAX_DEPTH) != 0)
+               ratio = maxt / (maxr / (GREAT_OBJ * K_MAX_DEPTH));
+       else
+               ratio = 99999L;
+
        /* Simulate a log graph */
-       if (maxt / maxr > 32)
+       if (ratio > 1000)
        {
                c = TERM_L_WHITE;
                r = "+-uncommon-+";
        }
-       if (maxt / maxr > 1024)
+       if (ratio > 3000)
        {
                c = TERM_SLATE;
                r = "+---rare---+";
        }
-       if (maxt / maxr > 32768L)
+       if (ratio > 32768L)
        {
                c = TERM_L_DARK;
-               r = "+--unique--+";
+               r = "+-VeryRare-+";
        }
 
        /* Calculate probabilities for each range */
-       for (i = 0; i < 20; i++)
+       for (i = 0; i < 22; i++)
        {
                /* Shift the values into view */
-               for (j = i * MAX_DEPTH / 20; j < (i + 1) * MAX_DEPTH / 20; j++)
+
+               int possibility = 0;
+               for (j = i * K_MAX_DEPTH / 22; j < (i + 1) * K_MAX_DEPTH / 22; j++)
+                       possibility += rarity[j] * (100 * maxt / total[j]);
+
+               possibility = possibility / maxr;
+
+               /* display[i] = log_{sqrt(2)}(possibility) */
+               display[i] = 0;
+               while (possibility)
                {
-                       display[i] += rarity[j] * maxt * 10 / total[j];
+                       display[i]++;
+                       possibility = possibility * 1000 / 1414;
                }
 
-               /* Correct proportions */
-               display[i] /= maxr;
-
                /* Track maximum */
                if (display[i] > maxd) maxd = display[i];
        }
 
        /* Normalize */
-       for (i = 0; i < 20; i++)
+       if (maxd > 10) for (i = 0; i < 22; i++)
        {
-               display[i] = display[i] * 10 / maxd;
+               display[i] = display[i] - maxd + 10;
        }
 
        /* Graph the rarities */
-       for (i = 0; i < 20; i++)
+       for (i = 0; i < 22; i++)
        {
                Term_putch(col, row + i + 1, TERM_WHITE,  '|');
 
+               prt(format("%d", (i * K_MAX_DEPTH / 220) % 10), row + i + 1, col);
+
+               if (display[i] <= 0) 
+                       continue;
+
                /* Note the level */
-               if ((i * MAX_DEPTH / 20 <= home) && (home < (i + 1) * MAX_DEPTH / 20))
+               if ((i * K_MAX_DEPTH / 22 <= home) && (home < (i + 1) * K_MAX_DEPTH / 22))
                {
                        c_prt(TERM_RED, format("%.*s", display[i], "**********"), row + i + 1, col + 1);
                }
@@ -300,16 +326,6 @@ static void prt_alloc(byte tval, byte sval, int row, int col)
 
        /* Make it look nice */
        prt(r, row, col);
-
-       Term_putch(col, row + 2, TERM_WHITE,  '6');
-
-       Term_putch(col, row + 8, TERM_WHITE,  'A');
-       Term_putch(col, row + 9, TERM_WHITE,  'L');
-       Term_putch(col, row + 10, TERM_WHITE, 'L');
-       Term_putch(col, row + 11, TERM_WHITE, 'O');
-       Term_putch(col, row + 12, TERM_WHITE, 'C');
-
-       prt("+", row + 21, col);
 }
 
 
@@ -526,7 +542,7 @@ static void wiz_display_item(object_type *o_ptr)
        /* Clear the screen */
        for (i = 1; i <= 23; i++) prt("", i, j - 2);
 
-       prt_alloc(o_ptr->tval, o_ptr->sval, 2, 0);
+       prt_alloc(o_ptr->tval, o_ptr->sval, 1, 0);
 
        /* Describe fully */
        object_desc_store(buf, o_ptr, TRUE, 3);
@@ -550,31 +566,31 @@ static void wiz_display_item(object_type *o_ptr)
        prt(format("ident = %04x  xtra1 = %-4d  xtra2 = %-4d  timeout = %-d",
                   o_ptr->ident, o_ptr->xtra1, o_ptr->xtra2, o_ptr->timeout), 8, j);
 
-       prt(format("xtra3 = %-4d  xtra4 = %-4d  xtra5 = %-4d",
-                  o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5), 9, j);
+       prt(format("xtra3 = %-4d  xtra4 = %-4d  xtra5 = %-4d  cursed  = %-d",
+                  o_ptr->xtra3, o_ptr->xtra4, o_ptr->xtra5, o_ptr->curse_flags), 9, j);
 
        prt("+------------FLAGS1------------+", 10, j);
        prt("AFFECT........SLAY........BRAND.", 11, j);
-       prt("      mr      cvae      xsqpaefc", 12, j);
-       prt("siwdccsissidsahanvudotgddhuoclio", 13, j);
-       prt("tnieohtrtrnipttmiinmrrnrrraiierl", 14, j);
-       prt("rtsxnarylcfgdkcpmldncltggpksdced", 15, j);
+       prt("      mf      cvae      xsqpaefc", 12, j);
+       prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
+       prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
+       prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
        prt_binary(f1, 16, j);
 
        prt("+------------FLAGS2------------+", 17, j);
        prt("SUST....IMMUN.RESIST............", 18, j);
-       prt("        aefctrpsaefcpfldbc sn   ", 19, j);
-       prt("siwdcc  clioheatcliooeialoshtncd", 20, j);
-       prt("tnieoh  ierlrfraierliatrnnnrhehi", 21, j);
-       prt("rtsxna..dcedwlatdcedsrekdfddrxss", 22, j);
+       prt("      r aefctrpsaefcpfldbc sn   ", 19, j);
+       prt("siwdcci clioheatcliooeialoshtncd", 20, j);
+       prt("tnieohd ierlrfraierliatrnnnrhehi", 21, j);
+       prt("rtsxnae.dcedwlatdcedsrekdfddrxss", 22, j);
        prt_binary(f2, 23, j);
 
        prt("+------------FLAGS3------------+", 10, j+32);
-       prt("fe cnn t   i  stdrmsiiii d abchp", 11, j+32);
-       prt("aa aoomyehsnlleeieihgggg rtgluvr", 12, j+32);
-       prt("uu utmacaihseielgggonnnnaaerercc", 13, j+32);
-       prt("rr reanusdotvtieeehtrrrrcilassuu", 14, j+32);
-       prt("aa algaryewaienpsntsaefctnevserr", 15, j+32);
+       prt("fe cnn t      stdrmsiiii d ab   ", 11, j+32);
+       prt("aa aoomywhs lleeieihgggg rtgl   ", 12, j+32);
+       prt("uu utmacaih eielgggonnnnaaere   ", 13, j+32);
+       prt("rr reanurdo vtieeehtrrrrcilas   ", 14, j+32);
+       prt("aa algarnew ienpsntsaefctnevs   ", 15, j+32);
        prt_binary(f3, 16, j+32);
 }
 
@@ -626,6 +642,7 @@ static tval_desc tvals[] =
        { TV_ARCANE_BOOK,       "Arcane Spellbook"     },
        { TV_ENCHANT_BOOK,      "Craft Spellbook"},
        { TV_DAEMON_BOOK,       "Daemon Spellbook"},
+       { TV_HAJA_BOOK,         "nanka Spellbook"},
        { TV_MUSIC_BOOK,        "Music Spellbook"      },
        { TV_HISSATSU_BOOK,     "Book of Kendo" },
        { TV_PARCHEMENT,        "Parchement" },
@@ -1325,7 +1342,7 @@ static void wiz_create_item(void)
        /* Create the item */
        object_prep(q_ptr, k_idx);
 
-       if (k_info[k_idx].flags3 & TR3_INSTA_ART)
+       if (k_info[k_idx].gen_flags & TRG_INSTA_ART)
        {
                int i;
 
@@ -1366,7 +1383,7 @@ static void wiz_create_item(void)
 static void do_cmd_wiz_cure_all(void)
 {
        /* Remove curses */
-       (void)remove_all_curse();
+//     (void)remove_all_curse();
 
        /* Restore stats */
        (void)res_stat(A_STR);
@@ -1462,18 +1479,8 @@ static void do_cmd_wiz_jump(void)
 
        if (!dun_level) dungeon_type = 0;
        p_ptr->inside_arena = FALSE;
-       leaving_quest = p_ptr->inside_quest;
 
-       /* Leaving an 'only once' quest marks it as failed */
-       if (leaving_quest &&
-               (quest[leaving_quest].flags & QUEST_FLAG_ONCE) &&
-               (quest[leaving_quest].status == QUEST_STATUS_TAKEN))
-       {
-               quest[leaving_quest].status = QUEST_STATUS_FAILED;
-               quest[leaving_quest].complev = (byte)p_ptr->lev;
-               if (record_fix_quest)
-                       do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
-       }
+       leave_quest_check();
 
        if (record_stair) do_cmd_write_nikki(NIKKI_WIZ_TELE,0,NULL);
 
@@ -1526,7 +1533,7 @@ static void do_cmd_wiz_summon(int num)
 
        for (i = 0; i < num; i++)
        {
-               (void)summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, FALSE);
+               (void)summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
        }
 }
 
@@ -1536,7 +1543,7 @@ static void do_cmd_wiz_summon(int num)
  *
  * XXX XXX XXX This function is rather dangerous
  */
-static void do_cmd_wiz_named(int r_idx, bool slp)
+static void do_cmd_wiz_named(int r_idx)
 {
        int i, x, y;
 
@@ -1558,7 +1565,7 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
                if (!cave_empty_bold(y, x)) continue;
 
                /* Place it (allow groups) */
-               if (place_monster_aux(y, x, r_idx, slp, TRUE, FALSE, FALSE, FALSE, FALSE)) break;
+               if (place_monster_aux(0, y, x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP))) break;
        }
 }
 
@@ -1568,9 +1575,9 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
  *
  * XXX XXX XXX This function is rather dangerous
  */
-static void do_cmd_wiz_named_friendly(int r_idx, bool slp)
+static void do_cmd_wiz_named_friendly(int r_idx)
 {
-       (void) summon_named_creature(py, px, r_idx, slp, TRUE, TRUE, TRUE);
+       (void) summon_named_creature(0, py, px, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
 }
 
 
@@ -1791,12 +1798,12 @@ void do_cmd_debug(void)
 
                /* Summon _friendly_ named monster */
                case 'N':
-                       do_cmd_wiz_named_friendly(command_arg, TRUE);
+                       do_cmd_wiz_named_friendly(command_arg);
                        break;
 
                /* Summon Named Monster */
                case 'n':
-                       do_cmd_wiz_named(command_arg, TRUE);
+                       do_cmd_wiz_named(command_arg);
                        break;
 
                /* Object playing routines */