; Environment: grass, beach, forest, ice ; Enemies: HP ATTACK WEAKNESS RESIST ; Killer Crab RND-32 PINCH MALAISE FIRE ; Plain Fish BUBBLE FIRE ICE ; Evil Tree RND-16 LEAVE FIRE ICE ; Wood Elf SING MALAISE BOLT ; Giant Bee RND-64 BUZZSAW ICE NONE ; Procrastinon RND-32 PUTOFF NONE MALAISE ; Ice Fish RND-32 AUGER FIRE ICE ; EvilPenguin WADDLE FIRE ICE ; Battle. ; Forest? Grassland? Artic? Ocean? ; ATTACK REST ; MAGIC LIMIT ; SUMMON RUN ; ; SUMMONS -> METROCAT VORTEXCN ; MAGIC -> HEAL FIRE ; ICE MALAISE ; BOLT ; LIMIT -> SLICE ZAP ; DROP ; ; 1 2 3 ;0123456789012345678901234567890123456789| ;----------------------------------------| ; | HP LIMIT | -> FIGHT/LIMIT 21 ;KILLER CRAB | DEATER 128/255 128 | ZAP 22 ; | | REST 23 ; | | RUN AWAY 24 ; ; struct enemy_type { ; char *name; ; int hp_base,hp_mask; ; char *attack_name; ; int weakness,resist; ; unsigned char *sprite; ;}; ;============================= ; Init Enemy ;============================= init_enemy: ; select type ; random, with weight toward proper terrain ; 50% completely random, 50% terrain based? ; enemy_type=random_8()%0x7; ; enemy_hp=enemies[enemy_type].hp_base+ ; (rand()&enemies[enemy_type].hp_mask); lda #0 ; hardcode crab for now sta ENEMY_TYPE sta ENEMY_X sta ENEMY_DEAD ; FIXME: lower lda #$00 ; BCD sta ENEMY_HP_LO lda #$03 ; BCD sta ENEMY_HP_HI lda #$3 ; max HP is 100 sta ENEMY_LEVEL lda #30 sta ENEMY_COUNT lda #killer_crab_sprite sta draw_enemy_smc2+1 rts ;static struct enemy_type enemies[9]={ ; [0]= { ; .name="Killer Crab", ; .hp_base=50, ; .hp_mask=0x1f, ; .attack_name="Pinch", ; .weakness=MAGIC_MALAISE, ; .resist=MAGIC_FIRE, ; .sprite=killer_crab, ; }, ; [1]= { ; .name="Plain Fish", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Bubble", ; .weakness=MAGIC_FIRE, ; .resist=MAGIC_ICE, ; .sprite=plain_fish, ; }, ; [2]= { ; .name="Evil Tree", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Leaves", ; .weakness=MAGIC_FIRE, ; .resist=MAGIC_ICE, ; .sprite=evil_tree, ; }, ; [3]= { ; .name="Wood Elf", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Song", ; .weakness=MAGIC_MALAISE, ; .resist=MAGIC_BOLT|MAGIC_HEAL, ; .sprite=wood_elf, ; }, ; [4]= { ; .name="Giant Bee", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Buzzsaw", ; .weakness=MAGIC_ICE, ; .resist=MAGIC_NONE, ; .sprite=giant_bee, ; }, ; [5]= { ; .name="Procrastinon", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Putoff", ; .weakness=MAGIC_NONE, ; .resist=MAGIC_MALAISE, ; .sprite=procrastinon, ; }, ; [6]= { ; .name="Ice Fish", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Auger", ; .weakness=MAGIC_FIRE, ; .resist=MAGIC_ICE, ; .sprite=ice_fish, ; }, ; [7]= { ; .name="Evil Penguin", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="Waddle", ; .weakness=MAGIC_FIRE, ; .resist=MAGIC_ICE, ; .sprite=evil_penguin, ; }, ; [8]= { ; .name="Act.Principl", ; .hp_base=10, ; .hp_mask=0x1f, ; .attack_name="BIRDIE", ; .weakness=MAGIC_NONE, ; .resist=MAGIC_ICE|MAGIC_FIRE, ; .sprite=roboknee1, ; }, ;}; ;========================= ; damage enemy ;========================= ; amount to damage in DAMAGE_VAL_LO/HI (BCD) damage_enemy: ; see if damage < enemy_hp, if so fine to subtract ; if not, set enemy_hp to zero ; 16 bit unsigned compare lda DAMAGE_VAL_HI ; compare high bytes cmp ENEMY_HP_HI bcc damage_enemy_subtract ; if damage_hihp_hi then bigger lda DAMAGE_VAL_LO ; compare low bytes cmp ENEMY_HP_LO bcc damage_enemy_subtract ; then damage_hi