forked from gameboyadvancesp/understanding-pokemon-red
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathremove_pokemon.asm
159 lines (134 loc) · 3.85 KB
/
remove_pokemon.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
; **_RemovePokemon**
; ポケモンを1匹、データスロットから削除する
; - - -
; 逃す処理などで利用
;
; INPUT:
; [wRemoveMonFromBox] = 0(手持ちから) or 1(PCBoxから)
; [wWhichPokemon] = 削除対象のポケモンがいるオフセット
_RemovePokemon:
; 手持ちから逃がす -> hl = wPartyCount
; PCBoxから逃がす -> hl = wNumInBox
ld hl, wPartyCount
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7b74
ld hl, wNumInBox
; まずはポケモンIDのリストを上に1つずつずらす
.asm_7b74
; hl(wPartyCount or wNumInBox)を1減らす
ld a, [hl]
dec a
ld [hli], a
; hl = 削除対象のlistのエントリ
ld a, [wWhichPokemon]
ld c, a
ld b, $0
add hl, bc
; de = 削除対象のlistのエントリ+1(.asm_7b81の準備)
ld e, l
ld d, h
inc de
; 削除したポケモンのスロットが空くのでスロットしたのポケモンを上に1つずつずらす
.asm_7b81
; 上にずらす
inline "[hl++] = [de++]"
; 次の下のスロットへ
inc a
jr nz, .asm_7b81
; 手持ちなら d = $5, hl = wPartyMonOT にして .asm_7b97へ
; PCBoxなら d = $13, hl = wBoxMonOT にして .asm_7b97へ
ld hl, wPartyMonOT
ld d, $5
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7b97
ld hl, wBoxMonOT
ld d, $13
.asm_7b97
; hl = NAME_LENGTH*[wWhichPokemon] = 削除対象のポケモンの名前文字列のポインタ
ld a, [wWhichPokemon]
call SkipFixedLengthTextEntries
; 最後のポケモンを選択していないなら -> .asm_7ba6
ld a, [wWhichPokemon]
cp d
jr nz, .asm_7ba6
; 最後のポケモンを選択しているならhlを$ffでクリアして終了(名前エントリをずらす必要がないので)
ld [hl], $ff
ret
; 次はニックネームを格納している配列を上にずらす
.asm_7ba6
; de = 削除対象のポケモンの名前文字列のポインタ
ld d, h
ld e, l
; hl = 削除対象の次のポケモンの名前文字列のポインタ
ld bc, NAME_LENGTH
add hl, bc
; bc = wPartyMonNicks(手持ち) or wBoxMonNicks(PCBox)
ld bc, wPartyMonNicks
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7bb8
ld bc, wBoxMonNicks
.asm_7bb8
call CopyDataUntil
; 次はPokemon Dataを格納しているlistを上にずらす
; (hl, bc) = (wPartyMons, wPartyMon2 - wPartyMon1) or (wBoxMons, wBoxMon2 - wBoxMon1) = (Pokemon Dataのテーブルの先頭エントリ, 配列の各エントリのサイズ)
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7bcd
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1
.asm_7bcd
; de = 処理対象のPokemon Data
ld a, [wWhichPokemon]
call AddNTimes
ld d, h
ld e, l
; (hl, bc) = (deの次のエントリ, 名前の文字列データを保持する配列の先頭のポインタ)
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7be4
ld bc, wBoxMon2 - wBoxMon1
add hl, bc
ld bc, wBoxMonOT
jr .asm_7beb
.asm_7be4
ld bc, wPartyMon2 - wPartyMon1
add hl, bc
ld bc, wPartyMonOT
; Pokemon Dataのテーブルの内容を1つ上にずらす
; INPUT:
; hl = Pokemon Dataのテーブルの1つ下のエントリ
; de = Pokemon Dataのテーブルのエントリ
; bc = 名前の文字列データを保持する配列の先頭のポインタ
.asm_7beb
call CopyDataUntil
; 次はニックネームのエントリを上にずらす
; hl = wPartyMonNicks or wBoxMonNicks
ld hl, wPartyMonNicks
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7bfa
ld hl, wBoxMonNicks
.asm_7bfa
; de = 削除対象のポケモンの名前エントリ
ld bc, NAME_LENGTH
ld a, [wWhichPokemon]
call AddNTimes
ld d, h
ld e, l
; hl = 削除対象のポケモンの次の名前エントリ
ld bc, NAME_LENGTH
add hl, bc
; bc = wPokedexOwned or wBoxMonNicksEnd
ld bc, wPokedexOwned
ld a, [wRemoveMonFromBox]
and a
jr z, .asm_7c15
ld bc, wBoxMonNicksEnd
; 名前エントリをずらす
.asm_7c15
jp CopyDataUntil