naming_screen.asm 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. AskName:
  2. call SaveScreenTilesToBuffer1
  3. call GetPredefRegisters
  4. push hl
  5. ld a, [wIsInBattle]
  6. dec a
  7. coord hl, 0, 0
  8. ld b, 4
  9. ld c, 11
  10. call z, ClearScreenArea ; only if in wild battle
  11. ld a, [wcf91]
  12. ld [wd11e], a
  13. call GetMonName
  14. ld hl, DoYouWantToNicknameText
  15. call PrintText
  16. coord hl, 14, 7
  17. lb bc, 8, 15
  18. ld a, TWO_OPTION_MENU
  19. ld [wTextBoxID], a
  20. call DisplayTextBoxID
  21. pop hl
  22. ld a, [wCurrentMenuItem]
  23. and a
  24. jr nz, .declinedNickname
  25. ld a, [wUpdateSpritesEnabled]
  26. push af
  27. xor a
  28. ld [wUpdateSpritesEnabled], a
  29. push hl
  30. ld a, NAME_MON_SCREEN
  31. ld [wNamingScreenType], a
  32. call DisplayNamingScreen
  33. ld a, [wIsInBattle]
  34. and a
  35. jr nz, .inBattle
  36. call ReloadMapSpriteTilePatterns
  37. .inBattle
  38. call LoadScreenTilesFromBuffer1
  39. pop hl
  40. pop af
  41. ld [wUpdateSpritesEnabled], a
  42. ld a, [wcf4b]
  43. cp "@"
  44. ret nz
  45. .declinedNickname
  46. ld d, h
  47. ld e, l
  48. ld hl, wcd6d
  49. ld bc, NAME_LENGTH
  50. jp CopyData
  51. DoYouWantToNicknameText:
  52. TX_FAR _DoYouWantToNicknameText
  53. db "@"
  54. DisplayNameRaterScreen:
  55. ld hl, wBuffer
  56. xor a
  57. ld [wUpdateSpritesEnabled], a
  58. ld a, NAME_MON_SCREEN
  59. ld [wNamingScreenType], a
  60. call DisplayNamingScreen
  61. call GBPalWhiteOutWithDelay3
  62. call RestoreScreenTilesAndReloadTilePatterns
  63. call LoadGBPal
  64. ld a, [wcf4b]
  65. cp "@"
  66. jr z, .playerCancelled
  67. ld hl, wPartyMonNicks
  68. ld bc, NAME_LENGTH
  69. ld a, [wWhichPokemon]
  70. call AddNTimes
  71. ld e, l
  72. ld d, h
  73. ld hl, wBuffer
  74. ld bc, NAME_LENGTH
  75. call CopyData
  76. and a
  77. ret
  78. .playerCancelled
  79. scf
  80. ret
  81. DisplayNamingScreen:
  82. push hl
  83. ld hl, wd730
  84. set 6, [hl]
  85. call GBPalWhiteOutWithDelay3
  86. call ClearScreen
  87. call UpdateSprites
  88. ld b, SET_PAL_GENERIC
  89. call RunPaletteCommand
  90. call LoadHpBarAndStatusTilePatterns
  91. call LoadEDTile
  92. callba LoadMonPartySpriteGfx
  93. coord hl, 0, 4
  94. ld b, 9
  95. ld c, 18
  96. call TextBoxBorder
  97. call PrintNamingText
  98. ld a, 3
  99. ld [wTopMenuItemY], a
  100. ld a, 1
  101. ld [wTopMenuItemX], a
  102. ld [wLastMenuItem], a
  103. ld [wCurrentMenuItem], a
  104. ld a, $ff
  105. ld [wMenuWatchedKeys], a
  106. ld a, 7
  107. ld [wMaxMenuItem], a
  108. ld a, "@"
  109. ld [wcf4b], a
  110. xor a
  111. ld hl, wNamingScreenSubmitName
  112. ld [hli], a
  113. ld [hli], a
  114. ld [wAnimCounter], a
  115. .selectReturnPoint
  116. call PrintAlphabet
  117. call GBPalNormal
  118. .ABStartReturnPoint
  119. ld a, [wNamingScreenSubmitName]
  120. and a
  121. jr nz, .submitNickname
  122. call PrintNicknameAndUnderscores
  123. .dPadReturnPoint
  124. call PlaceMenuCursor
  125. .inputLoop
  126. ld a, [wCurrentMenuItem]
  127. push af
  128. callba AnimatePartyMon_ForceSpeed1
  129. pop af
  130. ld [wCurrentMenuItem], a
  131. call JoypadLowSensitivity
  132. ld a, [hJoyPressed]
  133. and a
  134. jr z, .inputLoop
  135. ld hl, .namingScreenButtonFunctions
  136. .checkForPressedButton
  137. sla a
  138. jr c, .foundPressedButton
  139. inc hl
  140. inc hl
  141. inc hl
  142. inc hl
  143. jr .checkForPressedButton
  144. .foundPressedButton
  145. ld a, [hli]
  146. ld e, a
  147. ld a, [hli]
  148. ld d, a
  149. ld a, [hli]
  150. ld h, [hl]
  151. ld l, a
  152. push de
  153. jp hl
  154. .submitNickname
  155. pop de
  156. ld hl, wcf4b
  157. ld bc, NAME_LENGTH
  158. call CopyData
  159. call GBPalWhiteOutWithDelay3
  160. call ClearScreen
  161. call ClearSprites
  162. call RunDefaultPaletteCommand
  163. call GBPalNormal
  164. xor a
  165. ld [wAnimCounter], a
  166. ld hl, wd730
  167. res 6, [hl]
  168. ld a, [wIsInBattle]
  169. and a
  170. jp z, LoadTextBoxTilePatterns
  171. jpab LoadHudTilePatterns
  172. .namingScreenButtonFunctions
  173. dw .dPadReturnPoint
  174. dw .pressedDown
  175. dw .dPadReturnPoint
  176. dw .pressedUp
  177. dw .dPadReturnPoint
  178. dw .pressedLeft
  179. dw .dPadReturnPoint
  180. dw .pressedRight
  181. dw .ABStartReturnPoint
  182. dw .pressedStart
  183. dw .selectReturnPoint
  184. dw .pressedSelect
  185. dw .ABStartReturnPoint
  186. dw .pressedB
  187. dw .ABStartReturnPoint
  188. dw .pressedA
  189. .pressedA_changedCase
  190. pop de
  191. ld de, .selectReturnPoint
  192. push de
  193. .pressedSelect
  194. ld a, [wAlphabetCase]
  195. xor $1
  196. ld [wAlphabetCase], a
  197. ret
  198. .pressedStart
  199. ld a, 1
  200. ld [wNamingScreenSubmitName], a
  201. ret
  202. .pressedA
  203. ld a, [wCurrentMenuItem]
  204. cp $5 ; "ED" row
  205. jr nz, .didNotPressED
  206. ld a, [wTopMenuItemX]
  207. cp $11 ; "ED" column
  208. jr z, .pressedStart
  209. .didNotPressED
  210. ld a, [wCurrentMenuItem]
  211. cp $6 ; case switch row
  212. jr nz, .didNotPressCaseSwtich
  213. ld a, [wTopMenuItemX]
  214. cp $1 ; case switch column
  215. jr z, .pressedA_changedCase
  216. .didNotPressCaseSwtich
  217. ld hl, wMenuCursorLocation
  218. ld a, [hli]
  219. ld h, [hl]
  220. ld l, a
  221. inc hl
  222. ld a, [hl]
  223. ld [wNamingScreenLetter], a
  224. call CalcStringLength
  225. ld a, [wNamingScreenLetter]
  226. cp $e5
  227. ld de, Dakutens
  228. jr z, .dakutensAndHandakutens
  229. cp $e4
  230. ld de, Handakutens
  231. jr z, .dakutensAndHandakutens
  232. ld a, [wNamingScreenType]
  233. cp NAME_MON_SCREEN
  234. jr nc, .checkMonNameLength
  235. ld a, [wNamingScreenNameLength]
  236. cp $7 ; max length of player/rival names
  237. jr .checkNameLength
  238. .checkMonNameLength
  239. ld a, [wNamingScreenNameLength]
  240. cp $a ; max length of pokemon nicknames
  241. .checkNameLength
  242. jr c, .addLetter
  243. ret
  244. .dakutensAndHandakutens
  245. push hl
  246. call DakutensAndHandakutens
  247. pop hl
  248. ret nc
  249. dec hl
  250. .addLetter
  251. ld a, [wNamingScreenLetter]
  252. ld [hli], a
  253. ld [hl], "@"
  254. ld a, SFX_PRESS_AB
  255. call PlaySound
  256. ret
  257. .pressedB
  258. ld a, [wNamingScreenNameLength]
  259. and a
  260. ret z
  261. call CalcStringLength
  262. dec hl
  263. ld [hl], "@"
  264. ret
  265. .pressedRight
  266. ld a, [wCurrentMenuItem]
  267. cp $6
  268. ret z ; can't scroll right on bottom row
  269. ld a, [wTopMenuItemX]
  270. cp $11 ; max
  271. jp z, .wrapToFirstColumn
  272. inc a
  273. inc a
  274. jr .done
  275. .wrapToFirstColumn
  276. ld a, $1
  277. jr .done
  278. .pressedLeft
  279. ld a, [wCurrentMenuItem]
  280. cp $6
  281. ret z ; can't scroll right on bottom row
  282. ld a, [wTopMenuItemX]
  283. dec a
  284. jp z, .wrapToLastColumn
  285. dec a
  286. jr .done
  287. .wrapToLastColumn
  288. ld a, $11 ; max
  289. jr .done
  290. .pressedUp
  291. ld a, [wCurrentMenuItem]
  292. dec a
  293. ld [wCurrentMenuItem], a
  294. and a
  295. ret nz
  296. ld a, $6 ; wrap to bottom row
  297. ld [wCurrentMenuItem], a
  298. ld a, $1 ; force left column
  299. jr .done
  300. .pressedDown
  301. ld a, [wCurrentMenuItem]
  302. inc a
  303. ld [wCurrentMenuItem], a
  304. cp $7
  305. jr nz, .wrapToTopRow
  306. ld a, $1
  307. ld [wCurrentMenuItem], a
  308. jr .done
  309. .wrapToTopRow
  310. cp $6
  311. ret nz
  312. ld a, $1
  313. .done
  314. ld [wTopMenuItemX], a
  315. jp EraseMenuCursor
  316. LoadEDTile:
  317. ld de, ED_Tile
  318. ld hl, vFont + $700
  319. ld bc, (ED_TileEnd - ED_Tile) / $8
  320. ; to fix the graphical bug on poor emulators
  321. ;lb bc, BANK(ED_Tile), (ED_TileEnd - ED_Tile) / $8
  322. jp CopyVideoDataDouble
  323. ED_Tile:
  324. INCBIN "gfx/ED_tile.1bpp"
  325. ED_TileEnd:
  326. PrintAlphabet:
  327. xor a
  328. ld [H_AUTOBGTRANSFERENABLED], a
  329. ld a, [wAlphabetCase]
  330. and a
  331. ld de, LowerCaseAlphabet
  332. jr nz, .lowercase
  333. ld de, UpperCaseAlphabet
  334. .lowercase
  335. coord hl, 2, 5
  336. lb bc, 5, 9 ; 5 rows, 9 columns
  337. .outerLoop
  338. push bc
  339. .innerLoop
  340. ld a, [de]
  341. ld [hli], a
  342. inc hl
  343. inc de
  344. dec c
  345. jr nz, .innerLoop
  346. ld bc, SCREEN_WIDTH + 2
  347. add hl, bc
  348. pop bc
  349. dec b
  350. jr nz, .outerLoop
  351. call PlaceString
  352. ld a, $1
  353. ld [H_AUTOBGTRANSFERENABLED], a
  354. jp Delay3
  355. LowerCaseAlphabet:
  356. db "abcdefghijklmnopqrstuvwxyz ×():;[]",$e1,$e2,"-?!♂♀/⠄,¥UPPER CASE@"
  357. UpperCaseAlphabet:
  358. db "ABCDEFGHIJKLMNOPQRSTUVWXYZ ×():;[]",$e1,$e2,"-?!♂♀/⠄,¥lower case@"
  359. PrintNicknameAndUnderscores:
  360. call CalcStringLength
  361. ld a, c
  362. ld [wNamingScreenNameLength], a
  363. coord hl, 10, 2
  364. lb bc, 1, 10
  365. call ClearScreenArea
  366. coord hl, 10, 2
  367. ld de, wcf4b
  368. call PlaceString
  369. coord hl, 10, 3
  370. ld a, [wNamingScreenType]
  371. cp NAME_MON_SCREEN
  372. jr nc, .pokemon1
  373. ld b, 7 ; player or rival max name length
  374. jr .playerOrRival1
  375. .pokemon1
  376. ld b, 10 ; pokemon max name length
  377. .playerOrRival1
  378. ld a, $76 ; underscore tile id
  379. .placeUnderscoreLoop
  380. ld [hli], a
  381. dec b
  382. jr nz, .placeUnderscoreLoop
  383. ld a, [wNamingScreenType]
  384. cp NAME_MON_SCREEN
  385. ld a, [wNamingScreenNameLength]
  386. jr nc, .pokemon2
  387. cp 7 ; player or rival max name length
  388. jr .playerOrRival2
  389. .pokemon2
  390. cp 10 ; pokemon max name length
  391. .playerOrRival2
  392. jr nz, .emptySpacesRemaining
  393. ; when all spaces are filled, force the cursor onto the ED tile
  394. call EraseMenuCursor
  395. ld a, $11 ; "ED" x coord
  396. ld [wTopMenuItemX], a
  397. ld a, $5 ; "ED" y coord
  398. ld [wCurrentMenuItem], a
  399. ld a, [wNamingScreenType]
  400. cp NAME_MON_SCREEN
  401. ld a, 9 ; keep the last underscore raised
  402. jr nc, .pokemon3
  403. ld a, 6 ; keep the last underscore raised
  404. .pokemon3
  405. .emptySpacesRemaining
  406. ld c, a
  407. ld b, $0
  408. coord hl, 10, 3
  409. add hl, bc
  410. ld [hl], $77 ; raised underscore tile id
  411. ret
  412. DakutensAndHandakutens:
  413. push de
  414. call CalcStringLength
  415. dec hl
  416. ld a, [hl]
  417. pop hl
  418. ld de, $2
  419. call IsInArray
  420. ret nc
  421. inc hl
  422. ld a, [hl]
  423. ld [wNamingScreenLetter], a
  424. ret
  425. Dakutens:
  426. db "かが", "きぎ", "くぐ", "けげ", "こご"
  427. db "さざ", "しじ", "すず", "せぜ", "そぞ"
  428. db "ただ", "ちぢ", "つづ", "てで", "とど"
  429. db "はば", "ひび", "ふぶ", "へべ", "ほぼ"
  430. db "カガ", "キギ", "クグ", "ケゲ", "コゴ"
  431. db "サザ", "シジ", "スズ", "セゼ", "ソゾ"
  432. db "タダ", "チヂ", "ツヅ", "テデ", "トド"
  433. db "ハバ", "ヒビ", "フブ", "へべ", "ホボ"
  434. db $ff
  435. Handakutens:
  436. db "はぱ", "ひぴ", "ふぷ", "へぺ", "ほぽ"
  437. db "ハパ", "ヒピ", "フプ", "へぺ", "ホポ"
  438. db $ff
  439. ; calculates the length of the string at wcf4b and stores it in c
  440. CalcStringLength:
  441. ld hl, wcf4b
  442. ld c, $0
  443. .loop
  444. ld a, [hl]
  445. cp "@"
  446. ret z
  447. inc hl
  448. inc c
  449. jr .loop
  450. PrintNamingText:
  451. coord hl, 0, 1
  452. ld a, [wNamingScreenType]
  453. ld de, YourTextString
  454. and a
  455. jr z, .notNickname
  456. ld de, RivalsTextString
  457. dec a
  458. jr z, .notNickname
  459. ld a, [wcf91]
  460. ld [wMonPartySpriteSpecies], a
  461. push af
  462. callba WriteMonPartySpriteOAMBySpecies
  463. pop af
  464. ld [wd11e], a
  465. call GetMonName
  466. coord hl, 4, 1
  467. call PlaceString
  468. ld hl, $1
  469. add hl, bc
  470. ld [hl], $c9
  471. coord hl, 1, 3
  472. ld de, NicknameTextString
  473. jr .placeString
  474. .notNickname
  475. call PlaceString
  476. ld l, c
  477. ld h, b
  478. ld de, NameTextString
  479. .placeString
  480. jp PlaceString
  481. YourTextString:
  482. db "YOUR @"
  483. RivalsTextString:
  484. db "RIVAL's @"
  485. NameTextString:
  486. db "NAME?@"
  487. NicknameTextString:
  488. db "NICKNAME?@"