1 #include "cmd-io/cmd-autopick.h"
2 #include "cmd-io/cmd-save.h"
3 #include "autopick/autopick-util.h"
4 #include "autopick/autopick-commands-table.h"
5 #include "autopick/autopick-dirty-flags.h"
6 #include "autopick/autopick-initializer.h"
7 #include "autopick/autopick-entry.h"
8 #include "autopick/autopick-drawer.h"
9 #include "autopick/autopick-reader-writer.h"
10 #include "autopick/autopick-command-menu.h"
11 #include "autopick/autopick-editor-command.h"
12 #include "autopick/autopick-editor-util.h"
13 #include "autopick/autopick-inserter-killer.h"
14 #include "autopick/autopick-pref-processor.h"
15 #include "io/input-key-acceptor.h"
16 #include "io/read-pref-file.h"
17 #include "util/int-char-converter.h"
18 #include "term/screen-processor.h"
19 #include "world/world.h"
22 * Check special key code and get a movement command id
24 static int analyze_move_key(text_body_type *tb, int skey)
27 if (!(skey & SKEY_MASK)) return 0;
29 switch (skey & ~SKEY_MOD_MASK)
31 case SKEY_DOWN: com_id = EC_DOWN; break;
32 case SKEY_LEFT: com_id = EC_LEFT; break;
33 case SKEY_RIGHT: com_id = EC_RIGHT; break;
34 case SKEY_UP: com_id = EC_UP; break;
35 case SKEY_PGUP: com_id = EC_PGUP; break;
36 case SKEY_PGDOWN: com_id = EC_PGDOWN; break;
37 case SKEY_TOP: com_id = EC_TOP; break;
38 case SKEY_BOTTOM: com_id = EC_BOTTOM; break;
43 if (!(skey & SKEY_MOD_SHIFT))
46 * Un-shifted cursor keys cancells
47 * selection created by shift+cursor.
49 if (tb->mark & MARK_BY_SHIFT)
52 tb->dirty_flags |= DIRTY_ALL;
58 if (tb->mark) return com_id;
60 int len = strlen(tb->lines_list[tb->cy]);
61 tb->mark = MARK_MARK | MARK_BY_SHIFT;
64 if (tb->cx > len) tb->mx = len;
66 if (com_id == EC_UP || com_id == EC_DOWN)
68 tb->dirty_flags |= DIRTY_ALL;
72 tb->dirty_line = tb->cy;
79 * In-game editor of Object Auto-picker/Destoryer
80 * @param player_ptr プレーヤーへの参照ポインタ
82 void do_cmd_edit_autopick(player_type *player_ptr)
84 static int cx_save = 0;
85 static int cy_save = 0;
86 autopick_type an_entry, *entry = &an_entry;
87 char buf[MAX_LINELEN];
90 static s32b old_autosave_turn = 0L;
91 ape_quittance quit = APE_QUIT;
93 text_body_type text_body;
94 text_body_type *tb = &text_body;
98 tb->upper = tb->left = 0;
101 tb->old_cy = tb->old_upper = tb->old_left = -1;
102 tb->old_wid = tb->old_hgt = -1;
106 tb->search_o_ptr = NULL;
107 tb->search_str = NULL;
108 tb->last_destroyed = NULL;
109 tb->dirty_flags = DIRTY_ALL | DIRTY_MODE | DIRTY_EXPRESSION;
111 tb->filename_mode = PT_DEFAULT;
113 if (current_world_ptr->game_turn < old_autosave_turn)
115 while (old_autosave_turn > current_world_ptr->game_turn) old_autosave_turn -= TURNS_PER_TICK * TOWN_DAWN;
118 if (current_world_ptr->game_turn > old_autosave_turn + 100L)
120 do_cmd_save_game(player_ptr, TRUE);
121 old_autosave_turn = current_world_ptr->game_turn;
126 if (autopick_last_destroyed_object.k_idx)
128 autopick_entry_from_object(player_ptr, entry, &autopick_last_destroyed_object);
129 tb->last_destroyed = autopick_line_from_entry_kill(entry);
132 tb->lines_list = read_pickpref_text_lines(player_ptr, &tb->filename_mode);
133 for (i = 0; i < tb->cy; i++)
135 if (!tb->lines_list[i])
143 while (quit == APE_QUIT)
146 draw_text_editor(player_ptr, tb);
147 prt(_("(^Q:終了 ^W:セーブして終了, ESC:メニュー, その他:入力)",
148 "(^Q:Quit, ^W:Save&Quit, ESC:Menu, Other:Input text)"), 0, 0);
151 prt(format("(%d,%d)", tb->cx, tb->cy), 0, 60);
155 prt(format("(%d,%d)-(%d,%d)", tb->mx, tb->my, tb->cx, tb->cy), 0, 60);
158 term_gotoxy(tb->cx - tb->left, tb->cy - tb->upper + 1);
162 tb->old_upper = tb->upper;
163 tb->old_left = tb->left;
164 tb->old_wid = tb->wid;
165 tb->old_hgt = tb->hgt;
167 key = inkey_special(TRUE);
171 com_id = analyze_move_key(tb, key);
173 else if (key == ESCAPE)
175 com_id = do_command_menu(0, 0);
176 tb->dirty_flags |= DIRTY_SCREEN;
178 else if (!iscntrl((unsigned char)key))
183 tb->dirty_flags |= DIRTY_ALL;
186 insert_single_letter(tb, key);
191 com_id = get_com_id((char)key);
194 if (com_id) quit = do_editor_command(player_ptr, tb, com_id);
198 strcpy(buf, pickpref_filename(player_ptr, tb->filename_mode));
200 if (quit == APE_QUIT_AND_SAVE)
201 write_text_lines(buf, tb->lines_list);
203 free_text_lines(tb->lines_list);
204 string_free(tb->search_str);
205 string_free(tb->last_destroyed);
208 process_autopick_file(player_ptr, buf, process_autopick_file_command);
209 current_world_ptr->start_time = (u32b)time(NULL);