Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
update_keyboard.inc.c
Go to the documentation of this file.
1/* The keyboard's input: moving the cursor, turning the pages and typing the name */
3 s32 page;
4 s32 newPage;
5 s32 i;
6 s32 key;
7 s32 j;
8 u16 c;
9 u16 glyph;
10
11 switch (task->substate) {
12 case 0:
13 default:
14 OVL_NAME(startTween)(&task->keyboardScale, 1);
15 task->substate++;
16 break;
17 case 1:
18 if (OVL_NAME(updateTween)(&task->keyboardScale)) {
19 OVL_NAME(showNameWindows)(task, windows, 1);
20 task->active = 1;
21 task->substate++;
22 }
23 break;
24 case 2:
27 task->column = 13;
28 task->row = 6;
29 break;
30 }
31 if (OVL_NAME(keyboard).pageCount >= 2) {
32 page = task->page;
34 if (--task->page < 0) {
35 task->page = OVL_NAME(keyboard).pageCount - 1;
36 }
37 } else if (!PAD_HELD(PAD_L1) && PAD_PRESSED(PAD_R1)) {
38 if (++task->page > OVL_NAME(keyboard).pageCount - 1) {
39 task->page = 0;
40 }
41 }
42 if (page != task->page) {
44 OVL_NAME(showNameWindows)(task, windows, 1);
46 newPage = task->page;
47 if (newPage == 0 || newPage == 1) {
48 while (OVL_NAME(keyboard).pages[newPage].cells[task->row][task->column].kind != 1) {
49 if (--task->column < 0) {
50 task->column = 14;
51 }
52 }
53 } else {
54 while (OVL_NAME(keyboard).pages[newPage].cells[task->row][task->column].kind == 0) {
55 if (--task->row < 0) {
56 task->row = 6;
57 }
58 }
59 }
60 }
61 }
62 }
64 if (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind < 0) {
65 task->column += OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind;
66 }
67 do {
68 if (--task->column < 0) {
69 task->column = 14;
70 }
71 } while (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind != 1);
74 if (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind < 0) {
75 task->column += OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind;
76 }
77 do {
78 if (++task->column >= 15) {
79 task->column = 0;
80 }
81 } while (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind != 1);
83 }
85 do {
86 if (--task->row < 0) {
87 task->row = 6;
88 }
89 } while (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind == 0);
91 } else if (PAD_PRESSED(PAD_DOWN) || PAD_REPEATED(PAD_DOWN)) {
92 do {
93 if (++task->row >= 7) {
94 task->row = 0;
95 }
96 } while (OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].kind == 0);
98 }
100 for (i = 0; OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column + i].kind != 1; i--) {
101 }
102 key = task->row * 15 + task->column + i;
104 switch (key) {
105 case NAME_KEY_LEFT:
106 if (--task->cursor < 0) {
107 task->cursor = 0;
108 }
109 break;
110 case NAME_KEY_RIGHT:
111 if (++task->cursor > task->maxLength - 1) {
112 task->cursor = task->maxLength - 1;
113 }
114 break;
115 case NAME_KEY_DELETE:
116 if (task->cursor <= task->maxLength - 1 && task->name[task->cursor] == SJIS_SPACE) {
117 if (--task->cursor < 0) {
118 task->cursor = 0;
119 }
120 }
121 c = windows->name->style->iconMap[1].code;
122 task->name[task->cursor] = (c >> 8) | ((c & 0xFF) << 8);
123 windows->name->setText(windows->name, task->name);
124 break;
125 case NAME_KEY_SPACE:
126 c = windows->name->style->iconMap[1].code;
127 task->name[task->cursor] = (c >> 8) | ((c & 0xFF) << 8);
128 if (++task->cursor > task->maxLength - 1) {
129 task->cursor = task->maxLength - 1;
130 }
131 windows->name->setText(windows->name, task->name);
132 break;
133 case NAME_KEY_END:
134 for (j = 0; j < task->maxLength; j++) {
135 if (task->name[j] != SJIS_SPACE && task->name[j] != 0) {
136 for (j = 19; j >= 0; j--) {
137 if (task->name[j] != SJIS_SPACE) {
138 task->substate = 100;
139 return;
140 }
141 task->name[j] = 0;
142 }
143 }
144 }
145 task->substate = 20;
146 break;
147 default:
148 glyph = windows->name->style->sjisMap[OVL_NAME(keyboard).pages[task->page].cells[task->row][task->column].code].code;
149 task->name[task->cursor] = (glyph >> 8) | ((glyph & 0xFF) << 8);
150 windows->name->setText(windows->name, task->name);
151 if (++task->cursor > task->maxLength - 1) {
152 task->cursor = task->maxLength - 1;
153 task->column = 13;
154 task->row = 6;
155 }
156 break;
157 }
158 } else if (PAD_PRESSED(PAD_TRIANGLE)) {
160 if (task->cursor <= task->maxLength - 1 && task->name[task->cursor] == SJIS_SPACE) {
161 if (--task->cursor < 0) {
162 task->cursor = 0;
163 }
164 }
165 c = windows->name->style->iconMap[1].code;
166 task->name[task->cursor] = (c >> 8) | ((c & 0xFF) << 8);
167 windows->name->setText(windows->name, task->name);
168 }
169 break;
170 case 10:
171 OVL_NAME(showNameWindows)(task, windows, 0);
172 OVL_NAME(startTween)(&task->keyboardScale, 0);
173 task->active = 0;
174 task->substate++;
175 break;
176 case 11:
177 if (OVL_NAME(updateTween)(&task->keyboardScale)) {
178 task->state = TASK_DONE;
179 }
180 break;
181 case 20:
182 task->active = 0;
183 OVL_NAME(startTween)(&task->messageScale, 1);
184 task->substate++;
185 break;
186 case 21:
187 if (OVL_NAME(updateTween)(&task->messageScale)) {
188 windows->message->setString(windows->message, FILE_CACHE.load(TEXT_FILE(TEXT_NAME_ENTRY)), 0x12);
189 task->substate++;
190 }
191 break;
192 case 22:
193 if (PAD_PRESSED(PAD_CROSS)) {
194 windows->message->setVisible(windows->message, 0);
195 OVL_NAME(startTween)(&task->messageScale, 0);
196 task->substate++;
197 }
198 break;
199 case 23:
200 if (OVL_NAME(updateTween)(&task->messageScale)) {
201 task->active = 1;
202 task->substate = 2;
203 }
204 break;
205 case 100:
206 break;
207 }
208}
#define OVL_NAME(name)
The name of this overlay's copy of a function of src/shared/.
Definition battle_mode.h:26
signed int s32
Definition common.h:11
unsigned short u16
Definition common.h:10
#define TASK_DONE
Definition task.h:36
#define TEXT_NAME_ENTRY
NAMEDT: the keyboard's.
Definition file.h:219
#define TEXT_FILE(file)
Definition file.h:190
FileCache FILE_CACHE
The file cache.
Definition file_cache.c:7
#define NAME_KEY_DELETE
The keyboard's special keys: row * 15 + column of their first cell.
Definition name_entry.h:20
#define NAME_ENTRY_JAPANESE
The Japanese keyboard (three pages) is for language 0 of the European version, the Japanese version's...
Definition name_entry.h:34
#define NAME_KEY_RIGHT
Definition name_entry.h:23
#define NAME_KEY_LEFT
row 6: moves the cursor
Definition name_entry.h:22
#define NAME_KEY_END
row 6, column 13: where Start goes
Definition name_entry.h:24
#define NAME_KEY_SPACE
row 5
Definition name_entry.h:21
#define SJIS_SPACE
full-width space, 0x81 0x40
Definition name_entry.h:17
#define PAD_CROSS
Definition pad.h:31
#define PAD_START
Definition pad.h:21
#define PAD_DOWN
Definition pad.h:24
#define PAD_RIGHT
Definition pad.h:23
#define PAD_TRIANGLE
Definition pad.h:32
#define PAD_PRESSED(button)
One button of pad 1: newly pressed, auto-repeated while held, or held.
Definition pad.h:140
#define PAD_UP
Definition pad.h:22
#define PAD_L1
Definition pad.h:28
#define PAD_LEFT
Definition pad.h:25
#define PAD_HELD(button)
Definition pad.h:142
#define PAD_R1
Definition pad.h:29
#define PAD_REPEATED(button)
Definition pad.h:141
void showNameWindows(NameEntry *task, NameEntryWindows *windows, s32 show)
Shows the name entry's windows with their texts, or hides them.
SoundState SOUND
rsin and rcos (libgte) read rsin_tbl[a - 0x800] and the like: their addresses before the table fall i...
Definition sound.c:180
#define SOUND_MENU_CONFIRM
SYSTEM07.
Definition sound.h:44
#define SOUND_MENU_CANCEL
SYSTEM01.
Definition sound.h:39
#define SOUND_MENU_MOVE
SYSTEM06.
Definition sound.h:43
void startTween(PanelAnim *tween, s32 up)
Starts the menu stage's tween (stageFuncs.start) with its sound: up, from 0 to ONE over its duration,...
void *(* load)(u32 file)
Definition file.h:92
A name entry: the keyboard, the name typed so far and the panels that open and close.
Definition name_entry.h:95
short(* playSound)(s32 id)
returns the voice of a key-on
Definition sound.h:187
void updateKeyboard(NameEntry *task, NameEntryWindows *windows)
The keyboard's input: moving the cursor, turning the pages and typing the name.
s32 updateTween(PanelAnim *tween)
Steps the tween (stageFuncs.update): whether it has ended.