AIs werden immer gering geschätzt gerade einfach Logische. Dabei sind sie teilweise gar nicht so einfach zu implementieren. In Assembler sind sogar die einfachsten Sachen schon recht komplex und benötigen einiges an Konzentration (jmps etc!)
Hier die endgültige Version
Der SourceCode für ein wenig Intelligenz:
Kommentar dazu:
– Sonderbehandlung der Koordinaten (10* grösser als Pixelauflösung)
– Bewegungsrichtung in: gameobject_cat1 + cat2
– Bewegung nur im 16er PlayfieldRaster (getLevelBlock)
– Init und Update-Funktions
; ----------------------
; a_protect
; ----------------------
cmp.w #type_a_protect,gameobject_type(a6)
bne.w h_protect
; init
cmp.w #handle_init,handleState,
bne.w h_init_h_protect
move.w #objectstate_active,gameobject_state(a6)
move.w #collision_yes,gameobject_collision(a6)
move.w #cat0_friend,gameobject_cat0(a6)
move.w #0,gameobject_cat1(a6)
move.w #0,gameobject_cat2(a6)
move.w #art_type_bob1616,gameobject_art(a0)
move.w #atype_noanim,gameobject_animtype(a0)
move.w #atype_loop,gameobject_animtype(a0)
move.w #48,gameobject_animmin(a0)
move.w #48,gameobject_animind(a0)
move.w #49,gameobject_animmax(a0)
; *10
clr.l d0
move.w gameobject_x(a6),d0
mulu #10,d0
move.w d0,gameobject_x_expanded(a6)
clr.l d0
move.w gameobject_y(a6),d0
mulu #10,d0
move.w d0,gameobject_y_expanded(a6)
jmp end_handle
h_init_h_protect:
; update
cmp.w #handle_update,handleState
bne h_protect
; expanded ...
move.w gameobject_cat1(a6),d0
add.w d0,gameobject_x_expanded(a6)
move.w gameobject_cat2(a6),d1
add.w d1,gameobject_y_expanded(a6)
; expanded to x,y
clr.l d0
move.w gameobject_x_expanded(a6),d0
divu #10,d0
move.w d0,gameobject_x(a6)
clr.l d0
move.w gameobject_y_expanded(a6),d0
divu #10,d0
move.w d0,gameobject_y(a6)
; ...
cmp.w #avatar_y,gameobject_y(a6)
blt.w h_notdown_protect
move.w #objectstate_awake,gameobject_state(a6)
move.w #type_explosion,gameobject_type(a6)
h_notdown_protect:
; stop and think
clr.l d0
move.w gameobject_x(a6),d0
clr.l d1
move.w gameobject_y(a6),d1
; x%16==0 && y%16==0
divu #16,d0
swap d0
ext.w d0
cmp.w #0,d0
bne.w h_nodecision_protect
divu #16,d1
ext.w d1
swap d1
cmp.w #0,d1
bne.w h_nodecision_protect
; check going down as often as possible
; overwrite the rest
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
add.w #8,levelBlockX
add.w #16,levelBlockY
jsr getLevelBlock
; LEFT
cmp.w #0,gameobject_cat1(a6)
bgt h_tripleft_protect
beq h_tripleft_protect
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
sub.w #8,levelBlockX
add.w #8,levelBlockY
jsr getLevelBlock
cmp.w #undestroyableBlockStart,levelBlockIndex
blt.w h_tripleft_protect
cmp.w #destroyBlockStop,levelBlockIndex
bgt.w h_tripleft_protect
move.w #3,gameobject_cat1(a6)
move.w #0,gameobject_cat2(a6)
jmp h_tripleftright_protect
h_tripleft_protect:
; RIGHT
cmp.w #0,gameobject_cat1(a6)
blt h_tripright_protect
beq h_tripright_protect
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
add.w #16,levelBlockX
add.w #8,levelBlockY
jsr getLevelBlock
cmp.w #undestroyableBlockStart,levelBlockIndex
blt.w h_tripright_protect
cmp.w #destroyBlockStop,levelBlockIndex
bgt.w h_tripright_protect
move.w #-3,gameobject_cat1(a6)
move.w #0,gameobject_cat2(a6)
jmp h_tripleftright_protect
h_tripright_protect:
h_tripleftright_protect:
; AN OPEN FIELD DOWN?
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
add.w #8,levelBlockX
add.w #16,levelBlockY
jsr getLevelBlock
cmp.w #undestroyableBlockStart,levelBlockIndex
blt.w h_nodecision_downfree_protect
cmp.w #destroyBlockStop,levelBlockIndex
bgt.w h_nodecision_downfree_protect
jmp h_nodecision_down_protect
h_nodecision_downfree_protect:
; check left or right
move.w #0,gameobject_cat1(a6)
move.w #3,gameobject_cat2(a6)
jmp end_handle
h_nodecision_down_protect:
; let's think about
; move.w #0,gameobject_cat1(a6)
; move.w #0,gameobject_cat2(a6)
cmp.w #0,gameobject_cat1(a6)
bne h_nodecision_protect
; left?
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
sub.w #8,levelBlockX
add.w #8,levelBlockY
jsr getLevelBlock
cmp.w #undestroyableBlockStart,levelBlockIndex
blt.w h_nodecision_leftfree_protect
cmp.w #destroyBlockStop,levelBlockIndex
bgt.w h_nodecision_leftfree_protect
jmp h_nodecision_leftf_protect
h_nodecision_leftfree_protect:
; something else
move.w #-3,gameobject_cat1(a6)
move.w #0,gameobject_cat2(a6)
jmp end_handle
h_nodecision_leftf_protect:
; right?
move.w gameobject_x(a6),levelBlockX
move.w gameobject_y(a6),levelBlockY
add.w #16,levelBlockX
add.w #8,levelBlockY
jsr getLevelBlock
cmp.w #undestroyableBlockStart,levelBlockIndex
blt.w h_nodecision_rightfree_protect
cmp.w #destroyBlockStop,levelBlockIndex
bgt.w h_nodecision_rightfree_protect
jmp h_nodecision_rightf_protect
h_nodecision_rightfree_protect:
; something else
move.w #3,gameobject_cat1(a6)
move.w #0,gameobject_cat2(a6)
jmp end_handle
h_nodecision_rightf_protect:
h_nodecision_protect:
; or in the middle?
jmp end_handle
; ----------------------
h_protect:
; ----------------------