-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplayer.s
175 lines (163 loc) · 3.19 KB
/
player.s
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
.include "global.inc"
.export initialize_player
.export player_regen
.export player_dmg
.export award_exp
.segment "ZEROPAGE"
stats: .res .sizeof(PlayerStats)
.segment "BSS"
max_inventory = 100
inventory: .res .sizeof(Item)*max_inventory
.segment "CODE"
; initialize player mob
.proc initialize_player
; initialize HP to 10
lda #10
sta mobs+Mob::hp
; initialize tile type
lda #Mobs::player
sta mobs+Mob::type
; initialize direction
lda #Direction::right
sta mobs+Mob::direction
; initialize stats
lda #1
sta stats+PlayerStats::level
lda #0
sta stats+PlayerStats::exp
lda #10
sta stats+PlayerStats::maxhp
lda #0
sta stats+PlayerStats::power
rts
.endproc
; regen player every 8 turns
; todo figure out better way for later regen, perhaps resting?
.proc player_regen
lda turn
lsr
bcs done
lsr
bcs done
lsr
bcs done
; regen player if not at max HP
lda mobs + Mob::hp
cmp stats+PlayerStats::maxhp
beq done
; do regen
inc mobs + Mob::hp
done:
rts
.endproc
; generate damage for player based on level todo equipment?
; clobbers: x
.proc player_dmg
; generate random number 1-6
jsr d6
; add the player's power
clc
adc stats+PlayerStats::power
rts
.endproc
; award exp to player for mob at index y
; clobbers: all registers if level up
.proc award_exp
lda mobs+Mob::type, y
cmp #Mobs::goblin
beq goblin
cmp #Mobs::orc
beq orc
cmp #Mobs::ogre
beq ogre
cmp #Mobs::dragon
beq dragon
; error
rts
goblin:
lda #1
clc
adc stats+PlayerStats::exp
sta stats+PlayerStats::exp
jsr check_level
rts
orc:
lda #2
clc
adc stats+PlayerStats::exp
sta stats+PlayerStats::exp
jsr check_level
rts
ogre:
lda #5
clc
adc stats+PlayerStats::exp
sta stats+PlayerStats::exp
jsr check_level
rts
dragon:
lda #10
clc
adc stats+PlayerStats::exp
sta stats+PlayerStats::exp
jsr check_level
rts
.endproc
; award exp to player for mob at index y
; clobbers: all registers if level up
.proc check_level
lda stats+PlayerStats::level
cmp #4
bcc check_level3
cmp #6
bcc check_level5
cmp #8
bcc check_level7
cmp #10
bcc check_level9
; no more leveling at level 10
rts
check_level3:
; level player up every 10 goblins
lda stats+PlayerStats::exp
cmp #10
bcs levelup
rts
check_level5:
; level player up every 50 goblins
lda stats+PlayerStats::exp
cmp #50
bcs levelup
rts
check_level7:
; level player up every 100 goblins
lda stats+PlayerStats::exp
cmp #100
bcs levelup
rts
check_level9:
; level player up every 200 goblins
lda stats+PlayerStats::exp
cmp #200
bcs levelup
rts
; *ding*!
levelup:
inc stats+PlayerStats::level
; level up message
lda #Messages::levelup
jsr push_msg
; gain 5 max hp every level
lda stats+PlayerStats::maxhp
clc
adc #5
sta stats+PlayerStats::maxhp
; reset hp to max
sta mobs + Mob::hp
; gain 1 power
inc stats+PlayerStats::power
; reset exp to zero
lda #0
sta stats+PlayerStats::exp
rts
.endproc