Simple AIs? Ein Wunschtraum – Source Code

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:
; ----------------------

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert