	IFND	includeflag
levelflag = 1
	INCLUDE	Work:Sources/T3/T3_Main
	ENDC

Sound	= $70200
Level1	= $214cc
Level2	= $1d0bc

character	= $1711c
level_GFX	= $293ec
Para_field	= Rotate_Buffer
main2_GFX	= $258dc
AD_GFX		= $2b49c

Rotate2		= $49000

para_bg		= $27b8c

para_b		= 72

flash_buffer	= Rotate_Buffer+16384
RopeBob8	= $2938c


;
;			    Level Daten
;
bob00 	= $00000
msk00 	= $00120
bob01 	= $00180
msk01 	= $002a0
bob02 	= $00300
msk02 	= $00420
bob03 	= $00480
msk03 	= $005a0
bob04 	= $00600
msk04 	= $00630
bob05 	= $00640
msk05 	= $0067c
bob06 	= $00690
msk06 	= $006cc
bob07 	= $006e0
msk07 	= $00740
bob08 	= $00760
msk08 	= $007c0
bob09 	= $007e0
msk09 	= $00828
bob0a 	= $00840
msk0a 	= $0087c
bob0b 	= $00890
msk0b 	= $00a10
bob0c 	= $00a90
msk0c 	= $00cd0
bob0d 	= $00d90
msk0d 	= $00f9a
bob0e 	= $01048
msk0e 	= $01288
bob0f 	= $01348
msk0f 	= $01588
bob10 	= $01648
msk10 	= $01852
bob11 	= $01900
msk11 	= $01978
bob12 	= $019a0
msk12 	= $01a18
bob13 	= $01a40
msk13 	= $01a94
bob14 	= $01ab0
msk14 	= $01b04
bob15 	= $01b20
msk15 	= $01b9e
bob16 	= $01bc8
msk16 	= $01c4c
bob17 	= $01c78
msk17 	= $01cfc
bob18 	= $01d28
msk18 	= $01d88
bob19 	= $01da8
msk19 	= $01e08
bob1a 	= $01e28
msk1a 	= $01e76
bob1b 	= $01e90
msk1b 	= $01ede
bob1c 	= $01ef8
msk1c 	= $01f0a
bob1d 	= $01f10
msk1d 	= $01f28
bob1e 	= $01f30
msk1e 	= $01f54
bob1f 	= $01f60
msk1f 	= $01f96
bob20 	= $01fa8
msk20 	= $01fcc
bob21 	= $01fd8
msk21 	= $0201a
bob22 	= $02030
msk22 	= $02090


Cbob00 	= $00000
Cmsk00 	= $000d8
Cbob01 	= $00120
Cmsk01 	= $00264
Cbob02 	= $002d0
Cmsk02 	= $00438
Cbob03 	= $004b0
Cmsk03 	= $00630
Cbob04 	= $006b0
Cmsk04 	= $00830
Cbob05 	= $008b0
Cmsk05 	= $00a30
Cbob06 	= $00ab0
Cmsk06 	= $00c24
Cbob07 	= $00ca0
Cmsk07 	= $00de4
Cbob08 	= $00e50
Cmsk08 	= $00f70
Cbob09 	= $00fd0
Cmsk09 	= $01090
Cbob0a 	= $010d0
Cmsk0a 	= $01124
Cbob0b 	= $01140
Cmsk0b 	= $0116a
Cbob0c 	= $01178
Cmsk0c 	= $011c0
Cbob0d 	= $011d8
Cmsk0d 	= $0122c
Cbob0e 	= $01248
Cmsk0e 	= $0129c
Cbob0f 	= $012b8
Cmsk0f 	= $0130c
Cbob10 	= $01328
Cmsk10 	= $01376
Cbob11 	= $01390
Cmsk11 	= $013de
Cbob12 	= $013f8
Cmsk12 	= $01446
Cbob13 	= $01460
Cmsk13 	= $014ae
Cbob14 	= $014c8
Cmsk14 	= $01510
Cbob15 	= $01528
Cmsk15 	= $01576
Cbob16 	= $01590
Cmsk16 	= $015d8
Cbob17 	= $015f0
Cmsk17 	= $0161a
Cbob18 	= $01628
Cmsk18 	= $01676
Cbob19 	= $01690
Cmsk19 	= $016e4
Cbob1a 	= $01700
Cmsk1a 	= $0174e
Cbob1b 	= $01768
Cmsk1b 	= $017c2
Cbob1c 	= $017e0
Cmsk1c 	= $0183a
Cbob1d 	= $01858
Cmsk1d 	= $018b8
Cbob1e 	= $018d8
Cmsk1e 	= $01938
Cbob1f 	= $01958
Cmsk1f 	= $019b8
Cbob20 	= $019d8
Cmsk20 	= $01af8
Cbob21 	= $01b58
Cmsk21 	= $01c3c
Cbob22 	= $01c88
Cmsk22 	= $01d30
Cbob23 	= $01d68
Cmsk23 	= $01dc8
Cbob24 	= $01de8
Cmsk24 	= $01e48
Cbob25 	= $01e68
Cmsk25 	= $01ec2
Cbob26 	= $01ee0
Cmsk26 	= $01f40
Cbob27 	= $01f60
Cmsk27 	= $01ffc
Cbob28 	= $02030
Cmsk28 	= $020f0
Cbob29 	= $02130
Cmsk29 	= $02190
Cbob2a 	= $021b0
Cmsk2a 	= $02210
Cbob2b 	= $02230
Cmsk2b 	= $02290

Abob00 	= $00000
Abob01 	= $00a80
Abob02 	= $015a8

Blit_Rope8:
	tst.b	T_rope
	beq	.out
	tst.b	T_targeting
	bmi.s	.out
	tst.b	R_blink
	beq.s	.dont_blink
	subq.b	#1,R_blvz
	bpl.s	.dont_blink
	move.b	#0,R_blvz
	tst.b	Scr_Screen_num(a6)
	bne.s	.dont_blink
	move.b	#2,R_blvz
	eor.b	#$80,R_blink
.dont_blink:

	move.l	Scr_Supply_Field(a6),d0
	move.l	d0,bltdpth(a5)
	move.l	d0,bltcpth(a5)
	lea	dmaconr(a5),a4
	move.l	Rest_Pointer,a3
	lea	rope_coords(pc),a2

	tst.b	T_targeting
	bne	.skip0

	tst.w	Scr_Screen_num(a6)
	beq.s	.skip0
	addq.l	#4,a2
.skip0:
	moveq	#7,d7
.rope_loop:
	move.w	(a2)+,d0
	move.w	(a2)+,d1
	bmi.s	.end
	bsr.s	BlitRopeBall8
	addq.l	#4,a2
.dont_show:
	dbf	d7,.rope_loop
.end:
	move.l	a3,Rest_Pointer
	clr.w	(a3)
.out:
	tst.b	R_blink
	bpl.s	.no_off
	tst.w	Scr_Screen_num(a6)
	beq.s	.no_off
	eor.b	#$80,R_blink
.no_off:
	rts

BlitRopeBall8:
	move.l	#RopeBob8,d2
	tst.b	R_blink
	bpl.s	.no_blink
	move.l	#RopeBob8+48,d2
.no_blink:
	move.l	d2,bltbpth(a5)
	move.l	#RopeBob8+48,bltapth(a5)

	move.w	Scr_X_Level_Pos(a6),d2
	and.w	#15,d2
	add.w	d2,d0
	move.w	d0,d2
	lsr.w	#3,d0
	and.l	#$fffe,d0

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.under_wrap

	subq.w	#8,d3
	cmp.w	d3,d1
	bgt	.in_wrap

	;Komplett drber.

	add.l	Scr_Blt_Adr1(a6),d0
	bra.s	.goon
.under_wrap:

	;Komplett drunter.

	add.l	Scr_Blt_Adr2(a6),d0
	sub.w	d3,d1
.goon:
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d0

	move.l	d0,4(a3)

	and.w	#15,d2
	cmp.w	#7,d2
	blt	.blit_small

	move.l	#$ffff0000,bltafwm(a5)
	moveq	#planeb-4,d3
	move.l	#$fffefffe,d4
	move.w	#64*8*3+2,d5
	bra.s	.blit_it
.blit_small:
	move.l	#-1,bltafwm(a5)
	moveq	#planeb-2,d3
	moveq	#0,d4
	move.w	#64*8*3+1,d5
.blit_it:
	ror.w	#4,d2
	move.w	d2,bltcon1(a5)
	or.w	#$0fca,d2
	move.w	d2,bltcon0(a5)

	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d3,bltdmod(a5)
	move.w	d3,bltcmod(a5)
	move.w	d3,2(a3)
	move.l	d4,bltbmod(a5)
	move.w	d5,bltsize(a5)
.bwait0:
	btst	#14,(a4)
	bne	.bwait0
	move.w	d5,(a3)

	addq.l	#8,a3

	rts
.in_wrap:
	move.w	d3,d5
	sub.w	d1,d5
	addq.w	#8,d5

	move.l	d0,-(sp)
	add.l	Scr_Blt_Adr1(a6),d0	;Adresse fr obere Hlfte
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d0

	move.l	d0,4(a3)
	move.w	d5,d6
	add.w	d6,d6
	add.w	d6,d5		;*3
	asl.w	#6,d5

	and.w	#15,d2
	cmp.w	#7,d2
	blt	.blit_small2

	move.l	#$ffff0000,bltafwm(a5)
	moveq	#planeb-4,d3
	move.l	#$fffefffe,d4
	or.w	#2,d5
	bra.s	.blit_it2
.blit_small2:
	move.l	#-1,bltafwm(a5)
	moveq	#planeb-2,d3
	moveq	#0,d4
	or.w	#1,d5
.blit_it2:
	ror.w	#4,d2
	move.w	d2,bltcon1(a5)
	or.w	#$0fca,d2
	move.w	d2,bltcon0(a5)

	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d3,bltdmod(a5)
	move.w	d3,bltcmod(a5)
	move.w	d3,2(a3)
	move.l	d4,bltbmod(a5)
	move.w	d5,bltsize(a5)
.bwait1:
	btst	#14,(a4)
	bne	.bwait1
	move.w	d5,(a3)

	addq.l	#8,a3
	move.w	d3,2(a3)

	move.l	(sp)+,d0
	add.l	Scr_Blt_Adr2(a6),d0
	move.l	d0,4(a3)
	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d5,d6
	and.w	#$003f,d6
	and.w	#$ffc0,d5
	or.w	#64*8*3,d6
	sub.w	d5,d6
	move.w	d6,bltsize(a5)
.bwait2:
	btst	#14,(a4)
	bne	.bwait2
	move.w	d6,(a3)

	addq.l	#8,a3
	rts

		;AdressOffset,Anzahl Zeilen gesamt (Bob+maske),Breite pro Zeile
level_flipI:
		dc.w	bob0c,32*4,48/8
		dc.w	bob0d,29*4,48/8
		dc.w	bob0e,32*4,48/8
		dc.w	bob0f,32*4,48/8
		dc.w	bob10,29*4,48/8
		dc.w	bob18,16*4,16/8
		dc.w	bob19,16*4,16/8
		dc.w	bob1a,13*4,16/8
		dc.w	bob1b,13*4,16/8


		dc.w	-1

main2_flipI:	dc.w	Cbob18,13*4,16/8
		dc.w	Cbob19,14*4,16/8
		dc.w	Cbob1a,13*4,16/8
		dc.w	Cbob1b,15*4,16/8
		dc.w	Cbob1c,15*4,16/8
		dc.w	-1

Cue_Table1:	dc.w	1435,1638	;2047,2065


Cue_Table2:	dc.w	80,70
		dc.w	978,531
		dc.w	90,1081
		dc.w	792,1441

Bob_Structure:	dcb.b	BOB_MAXIMUM*BOB_ENTRY_LENGTH,BOB_FALSE

Bob_Structure_End = Bob_Structure+(BOB_MAXIMUM*BOB_ENTRY_LENGTH)

Bob_Info_Tab_Adrs	dc.l	Diamond_Info_0
		;--1
		dc.l	Explo_Info_1	;1 Big Xplo
		dc.l	Explo_Info_2	;2 Small Xplo
		dc.l	Box_Info_1	;3 Extrabox
		dc.l	Box_Info_2	;4 Extrabox Deckel
		dc.l	Bonus_Info_1	;5 PowerUp
		dc.l	Rocket_Info_1	;6 Lenkrakete
		dc.l	Shoot_Info_1	;7 Schuss
		dc.l	CuePoint_Info_1	;8 Cuepoint
		dc.l	Mine_Info_1	;9 MinenExplo
		dc.l	Diamond_Info_1	;10 Diamant
		dc.l	Beule_Info_1	;11 Beule
		dc.l	Ball_Info_1	;12 Ball
		dc.l	Slime_Info_1	;13 Slime
		dc.l	Roller_Info_1	;14 Roller
		dc.l	Dog_Info_1	;15 Dog
		dc.l	Pfeil_Info_1	;16 Exit-Pfeil
		dc.l	Egg_Info_1	;17 Egg
		dc.l	Drop_Info_1	;18 Tropfen
		dc.l	Flyer_Info_1	;19 Big Flyer

Explo_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	128		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Standart_BobAnim	;Routine, die Bob verwaltet
		dc.l	Explo_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Explo_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Standart_BobAnim	;Routine, die Bob verwaltet
		dc.l	Explo2_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Box_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Extrabox	;Routine, die Bob verwaltet
		dc.l	Box_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Box_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Box_Deckel	;Routine, die Bob verwaltet
		dc.l	Deckel_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Bonus_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Bonus	;Routine, die Bob verwaltet
		dc.l	Bonus1_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Shoot_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Shoot_Start	;Routine, die Bob verwaltet
		dc.l	Shoot_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rocket_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	16		;Bob_I_Out_X_Val
		dc.w	16		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Rocket		;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rocket_Info_2:	;Nur Dummy-Info, fr geflippte Rocket.
		dc.w	NORM+FLIP	;Bob_Mode
		dc.w	16		;Bob_I_Out_X_Val
		dc.w	16		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	-1*2		;A Modulo
		dc.w	-1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Rocket		;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

CuePoint_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	CuePointStart	;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Mine_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	MineExplo	;Routine, die Bob verwaltet
		dc.l	MineExplo_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Diamond_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Diamond_Start	;Routine, die Bob verwaltet
		dc.l	Diamond_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Diamond_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	1		;Blit-Breite in Wrtern
		dc.w	2		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Diamond		;Routine, die Bob verwaltet
		dc.l	Diamond_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffefffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Beule_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	6		;Breite einer Zeile der Maske in Bytes
		dc.w	3*2		;A Modulo
		dc.w	3*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Beule		;Routine, die Bob verwaltet
		dc.l	Beule_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Ball_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	4		;Hitpoints
		dc.l	Ball		;Routine, die Bob verwaltet
		dc.l	Ball_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Ball_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Ball		;Routine, die Bob verwaltet
		dc.l	Ball_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Slime_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	12		;Hitpoints
		dc.l	Start_Slime	;Routine, die Bob verwaltet
		dc.l	Slime_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Roller_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	12		;Hitpoints
		dc.l	Start_Roller	;Routine, die Bob verwaltet
		dc.l	Roller_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Dog_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	6		;Breite einer Zeile der Maske in Bytes
		dc.w	3*2		;A Modulo
		dc.w	3*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	12		;Hitpoints
		dc.l	Start_Dog	;Routine, die Bob verwaltet
		dc.l	Dog_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Pfeil_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	20		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Pfeil	;Routine, die Bob verwaltet
		dc.l	Pfeil_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Egg_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	20		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Egg	;Routine, die Bob verwaltet
		dc.l	Egg_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Egg_Info_2:	;Nur Dummy-Info, fr geflippte Rocket.
		dc.w	NORM+FLIP	;Bob_Mode
		dc.w	16		;Bob_I_Out_X_Val
		dc.w	16		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	13		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	-1*2		;A Modulo
		dc.w	-1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Rocket		;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffffffd	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Drop_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Drop	;Routine, die Bob verwaltet
		dc.l	Drop_AnimTable	;Zeiger auf nchste Anim

		dc.w	6		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Flyer_Info_1:
		dc.w	BLOCK+FAST	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	96		;Breite in Pixels
		dc.w	76		;Hhe in Pixels
		dc.w	3		;Tiefe in Planes
		dc.w	12		;Breite einer Zeile der Maske in Bytes
		dc.w	6*2		;A Modulo
		dc.w	6*2*3		;B Modulo
		dc.w	planeb*3	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	7		;Blit-Breite in Wrtern
		dc.w	14		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Flyer	;Routine, die Bob verwaltet
		dc.l	Flyer_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Flyer
*---------------------------------------------------------------------------

	rsset	Bob_Special_1
Fbxdir	rs.l	1
Fbydir	rs.l	1
Fdelay	rs.w	1
Fxlow	rs.w	1
Fylow	rs.w	1

;flag	rs.b	1
;wing	rs.b	1

Start_Flyer:					;Init main-object


	moveq	#15,d0
;	add.b	pl_power.w,d0
;	add.b	pl_power.w,d0
	move.w	d0,Bob_Power(a4)

;	jsr	add_object.w			;Add 2nd half of body
;	move.l	#big_slave,O_HANDLE(a0)
;	move.l	O_INFO(a5),O_INFO(a0)
;	move.l	O_XPOS(a5),O_XPOS(a0)
;	move.w	#1,O_PHA(a0)
;	st	O_SHOW(a0)
;	sf	flag(a0)
;	move.l	a0,ptr(a5)

	clr.w	Fxlow(a4)			;Set variables in both objects
	clr.w	Fylow(a4)
	clr.l	Fbxdir(a4)
	clr.l	Fbydir(a4)
	move.w	#60,Fdelay(a4)			;1 sec to first shot

;	move.l	a0,a4				;Wings...
;	jsr	add_objectlast.w
;	move.l	a0,ptr(a4)
;	move.l	#handle_wing,O_HANDLE(a0)
;	move.l	O_INFO(a5),O_INFO(a0)
;	move.l	O_XPOS(a5),O_XPOS(a0)
;	move.w	#2,O_PHA(a0)
;	st	O_SHOW(a0)
;	sf	flag(a0)
;	sf	wing(a0)
;	move.l	a0,a4
;	jsr	add_objectlast.w
;	move.l	a0,ptr(a4)
;	move.l	#handle_wing,O_HANDLE(a0)
;	move.l	O_INFO(a5),O_INFO(a0)
;	move.l	O_XPOS(a5),O_XPOS(a0)
;	move.w	#4,O_PHA(a0)
;	st	O_SHOW(a0)
;	sf	flag(a0)
;	sf	wing(a0)
	move.l	#Flyer,Bob_Routine(a4)


	move.l	Act_Bob_Structure,a0
	move.l	a4,a1
	move.w	#BOB_ENTRY_LENGTH-1,d7
.copy:
	move.b	(a0),d0
	move.b	(a1),(a0)+
	move.b	d0,(a1)+
	dbf	d7,.copy

	move.l	Act_Bob_Structure,a0

	moveq	#0,d0
	move.w	Bob_to_Info_Offs(a4),d0		;Info-Adress des Alten Eintrags!
	add.l	a0,d0
	sub.l	a4,d0
	move.w	d0,Bob_to_Info_Offs(a4)

	moveq	#0,d0
	move.w	Bob_to_Info_Offs(a0),d0		;Info-Adress meines Eintrags!
	add.l	a4,d0
	sub.l	a0,d0
	move.w	d0,Bob_to_Info_Offs(a0)

	rts

Flyer:
;	tst.b	O_POW(a5)			;Destroyed ?
;	.if (minus) {
;		move.l	#$170,d0		;Yes, 100 Points
;		jsr	add_score.w
;		move.l	ptr(a5),a0
;		st	flag(a0)
;		move.l	ptr(a0),a0
;		st	flag(a0)
;		move.l	ptr(a0),a0
;		st	flag(a0)
;		PLAY_FX	#13
;		addq.w	#8,O_XPOS(a5)
;		subq.w	#8,O_YPOS(a5)
;		jmp	make_expl.w
;	}
;	tst.b	O_HIT(a5)			;Hit ?
;	.if (not zero) {			;Yes,...
;		sf	O_HIT(a5)
;		move.b	#4,O_FLIC(a5)
;		move.l	ptr(a5),a0
;		move.b	#4,O_FLIC(a0)
;		PLAY_HIT #10
;	}

	move.l	Fbxdir(a4),d1			;Calc new xdir...
	move.w	Bob_X_Position(a4),d0
	addi.w	#32,d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	T_posX,d0			;Where is the player ?
	blt.s	.is_right
		cmpi.l	#-2<<16,d1
		ble.s	.no
		subi.l	#$00000800,d1
		bra.s	.no
.is_right:
		cmpi.l	#2<<16,d1
		bge.s	.no
		addi.l	#$00000800,d1
.no:
	move.l	d1,Fbxdir(a4)

	move.l	Fbydir(a4),d1			;Calc new ydir...
	move.w	Bob_Y_Position(a4),d0
	addi.w	#64,d0
	sub.w	Scr_Y_Level_Pos(a6),d0

	cmp.w	T_posY,d0			;Where is the player ?
	ble.s	.is_down
		cmpi.l	#-2<<16,d1
		ble.s	.no1
		subi.l	#$00001800,d1
		bra.s	.no1
.is_down:
		cmpi.l	#2<<16,d1
		bge.s	.no1
		addi.l	#$00001800,d1
.no1:
	move.l	d1,Fbydir(a4)

	movem.w	Bob_X_Position(a4),d0-d1	;Any walls that hinder side-movement ?
	sub.w	#16,d1
	sub.w	#10,d0
	tst.w	Fbxdir(a4)
	bmi.s	.to_left
		addi.w	#86,d0
.to_left:
	moveq	#6,d7

.check_lr:
		movem.w	d0-d1,-(sp)
		bsr	flyer_check_kollision
		movem.w	(sp)+,d0-d1
		bne.s	.wall_found
		add.w	#16,d1
	dbf	d7,.check_lr

	bra.s	.no_wall
.wall_found:
	clr.l	Fbxdir(a4)			;Yes, stop alien
.no_wall:
	movem.w	Bob_X_Position(a4),d0-d1	;Any floor etc. that hinders
	sub.w	#10,d1
	tst.w	Fbydir(a4)			;up- & down-movement ?
		bmi.s	.to_up
		addi.w	#70,d1
.to_up:
	addq.w	#8,d1
	moveq	#7,d7
.check_ud:
		movem.w	d0-d1,-(sp)
		bsr	flyer_check_kollision
		movem.w	(sp)+,d0-d1
		bne.s	.floor_found
		add.w	#16,d0
	dbf	d7,.check_ud
	bra.s	.no_floor
.floor_found:
	clr.l	Fbydir(a4)			;Yes, stop alien
.no_floor:

	move.l	Fbxdir(a4),d0			;Add xdir, ydir to position
	add.w	d0,Fxlow(a4)
	swap	d0
	move.w	Bob_X_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_X_Position(a4)
	move.l	Fbydir(a4),d0
	add.w	d0,Fylow(a4)
	swap	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)


;	subq.w	#1,delay(a5)			;New shot ?
;	.if.l (minus) {
;		move.w	#60,delay(a5)		;Yes, reset delay...
;		move.w	O_XPOS(a5),d0
;		addi.w	#30,d0
;		cmp.w	pl_xpos.w,d0		;Player under alien ?
;		.if (less than) {		;Yes...
;			jsr	add_object.w	;Start shot...
;			move.l	a0,a3
;			move.l	O_XPOS(a5),O_XPOS(a3)
;			addi.w	#24,O_XPOS(a3)
;			addi.w	#50,O_YPOS(a3)
;			move.l	#handle_shot,O_HANDLE(a3)
;			clr.w	sxlow(a3)
;			clr.w	sylow(a3)
;			move.l	O_INFO(a5),O_INFO(a3)
;			move.l	O_COL(a5),O_COL(a3)
;			move.w	#6,O_PHA(a3)
;			st	O_SHOW(a3)
;			st	O_COLEN(a3)
;			move.b	#8,O_POW(a3)
;			jsr	rnd.w			;Random direction
;			andi.l	#$ff00,d0
;			addi.l	#1<<16,d0
;			move.w	O_XPOS(a3),d1
;			subq.w	#8,d1
;			cmp.w	pl_xpos.w,d1
;			.if (greater) {
;				neg.l	d0
;			}
;			move.l	d0,sxdir(a3)
;			jsr	rnd.w
;			andi.l	#$ff00,d0
;			addi.l	#1<<16,d0
;			move.l	d0,sydir(a3)
;		}
;	}

	bra	Standart_BobAnim

flyer_check_kollision:
	cmp.w	#32,d1
	bge.s	.ok
	moveq	#32,d1
.ok:
	move.b	d0,d3		;fr 8*8er Abfrage.
	move.b	d1,d4		;fr 8*8er Abfrage.

	lsr.w	#4,d0
	move.l	Scr_Level(a6),a0

	sub.w	#32,d1

	adda.w	d0,a0
	lsr.w	#4,d1

	mulu	Scr_Level_Width(a6),d1
	add.l	d1,a0
	cmp.b	#59,-1(a0)

	rts

;big_slave:
;	tst.b	flag(a5)			;Explosions ?
;	.if (minus) {
;		jsr	rnd.w			;Let slave explode
;		andi.w	#31,d0
;		add.w	d0,O_XPOS(a5)
;		jsr	rnd.w
;		andi.w	#31,d0
;		add.w	d0,O_YPOS(a5)
;		jmp	make_expl.w
;	}
;	.if (not zero) {			;Free ?
;		move.l	a5,a0			;Free slave...
;		jmp	free_object.w
;	}
;	rts

;handle_wing:					;Let wing "swing"
;	not.b	wing(a5)
;	bne.s	big_slave
;	eori.w	#1,O_PHA(a5)
;	bra.s	big_slave



;	rsset	O_USR0
;sxlow	rs.w	1
;sylow	rs.w	1
;sxdir	rs.l	1
;sydir	rs.l	1

;handle_shot:
;	movem.w	scroll1+xdir.w,d0-d1		;Handle scrolling
;	sub.w	d0,O_XPOS(a5)
;	sub.w	d1,O_YPOS(a5)
;
;	tst.b	O_POW(a5)			;Destroyed ?
;	.if (minus) {
;		subq.w	#8,O_XPOS(a5)
;		subq.w	#8,O_YPOS(a5)
;		jmp	make_expl.w
;	}
;	tst.b	O_HIT(a5)			;Hit ?
;	.if (not zero) {			;Yes,...
;		sf	O_HIT(a5)
;		move.b	#4,O_FLIC(a5)
;	}
;
;	move.l	sxdir(a5),d0			;Add direction...
;	add.w	d0,sxlow(a5)
;	swap	d0
;	move.w	O_XPOS(a5),d1
;	addx.w	d0,d1
;	move.w	d1,O_XPOS(a5)
;	move.l	sydir(a5),d0
;	add.w	d0,sylow(a5)
;	swap	d0
;	move.w	O_YPOS(a5),d1
;	addx.w	d0,d1
;	move.w	d1,O_YPOS(a5)
;
;	movem.w	O_XPOS(a5),d0-d1		;Any walls ?
;	addq.w	#8,d0
;	addq.w	#8,d1
;	jsr	test_col.w
;	.if (not zero) {
;		subq.w	#8,O_XPOS(a5)		;Yes, let object explode
;		subq.w	#8,O_YPOS(a5)
;		jmp	make_expl.w
;	}
;
;	movem.w	O_XPOS(a5),d0-d1		;Still on screen ?
;	addi.w	#64,d0
;	addi.w	#64,d1
;	cmpi.w	#320+128,d0
;	bhs.s	free_shot
;	cmpi.w	#224+128,d1
;	bhs.s	free_shot
;	rts
;free_shot:					;No, let object be freed
;	move.l	a5,a0
;	jmp	free_object.w


Flyer_AnimTable:
	dc.l	AD_GFX,0
	dc.w	0,0,76,0,0,0,0
	dc.l	AD_GFX+$ab0,0
	dc.w	0,0,76,0,0,0,0
	dc.w	ENTRY_END
	dc.l	Flyer_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Tropfen
*---------------------------------------------------------------------------

Start_Drop:
	cmp.b	#4,Drop_count
	beq	Out_Bob
	addq.b	#1,Drop_count
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
init_tropfen4:
	bsr	rnd
	andi.w	#$1f,d0
	move.w	d0,Bob_Special_1(a4)
	move.l	#Drop,Bob_Routine(a4)

Drop:
	tst.w	Bob_Y_Position(a4)		;Above screen ?
	bmi.s	.out_of_screen
	subq.w	#1,Bob_Special_1(a4)	;No...
	bpl.s	.out_of_screen

	move.w	#85,Bob_Special_1(a4)
	movem.w	Bob_X_Position(a4),d1-d2
	moveq	#18,d0
	lea	Area_Enter_Vector(pc),a1
	move.l	a4,-(sp)
	bsr	Search_Bob_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	tst.w	d7
	bmi.s	.out_of_screen

	move.l	#handle_ftropfen,Bob_Routine(a0)
	move.b	#BOB_NOCOL,Bob_Used(a0)
	move.w	#15,Bob_Special_1(a0)
	sf	Bob_Special_2(a0)
	move.w	#5,Bob_Special_3(a0)
	move.w	#$80,tydir(a0)
	sf	tylow(a0)
	clr.w	Bob_Special_6(a0)
.out_of_screen:
	bsr	Test_Bob_Out2
	tst.b	Bob_Used(a4)
	bpl.s	.out
	subq.b	#1,Drop_count
.out:
	rts

Drop_count:	dc.w	0

	rsset	Bob_Special_4
tydir	rs.w	1
tylow	rs.b	1

handle_ftropfen:
	tst.b	Bob_Special_2(a4)
	beq.s	.no_kill
	subq.w	#1,Bob_Special_3(a4)
	bpl	.no
	bra	Out_Bob_Damage
.no_kill:
	cmpi.w	#4,Bob_Special_6(a4)
	bge.s	.fall
	subq.w	#1,Bob_Special_1(a4)
	bpl.s	.no
	move.w	Bob_Special_6(a4),d0
	add.w	d0,d0
	lea	.delay_tab(pc),a0
	move.w	(a0,d0.w),Bob_Special_1(a4)

	addq.w	#1,Bob_Special_6(a4)
	bsr	Get_Next_Bob_Frame
	bra.s	.no
.fall:
	movem.w	Bob_X_Position(a4),d0-d1

		addq.w	#8,d0
		addi.w	#16,d1
		bsr	check_obj_kollision
		bne.s	.stop_fall
			cmpi.w	#$0600,tydir(a4)
			bge.s	.no_speedup
				addi.w	#$0048,tydir(a4)
.no_speedup:
			move.b	tydir+1(a4),d0
			add.b	d0,tylow(a4)
			move.b	tydir(a4),d0
			ext.w	d0
			move.w	Bob_Y_Position(a4),d1
			addx.w	d0,d1
			move.w	d1,Bob_Y_Position(a4)
	bra.s	.no
.stop_fall:
;			PLAY_FX	#21
			st	Bob_Special_2(a4)
			addq.w	#1,Bob_Special_6(a4)
			bsr	Get_Next_Bob_Frame
.no:
	bra	Test_Bob_Out

.delay_tab:
	dc.w	8,6,4,2

Drop_AnimTable:
		dc.l	level_GFX+bob1c,level_GFX+msk1c
		dc.w	0,0,3,2,2,28,24
		dc.l	level_GFX+bob1d,level_GFX+msk1d
		dc.w	0,0,4,2,2,28,24
		dc.l	level_GFX+bob1e,level_GFX+msk1e
		dc.w	0,0,6,2,2,28,24
		dc.l	level_GFX+bob1f,level_GFX+msk1f
		dc.w	0,0,9,2,2,28,24
		dc.l	level_GFX+bob20,level_GFX+msk20
		dc.w	0,8,6,2,2,28,24
		dc.l	level_GFX+bob21,level_GFX+msk21
		dc.w	0,5,11,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Drop_AnimTable	

*---------------------------------------------------------------------------
*	Routine and AnimTable of     AlienEgg
*---------------------------------------------------------------------------

		rsset	Bob_Special_1
Edelay		rs.w	1
Ehatching	rs.b	1
Ehatched	rs.b	1
Ehiten		rs.b	1
Ejumps		rs.b	1
E_PHA		=	Bob_Status

		rsset	Bob_Special_1
Eaxdir		rs.w	1
Eaydir		rs.l	1
Eaylow		rs.w	1
Ejump		rs.b	1
Ewalk		rs.b	1

Start_Egg:
	move.b	#BOB_NOPLCOL,Bob_Used(a4)
	clr.w	E_PHA(a4)
	clr.l	Edelay(a4)
	move.w	#10,Bob_Power(a4)
;	move.b	#1,O_COLEN(a5)
	sf	Ehiten(a4)
	move.b	#1,Ejumps(a4)
	move.l	#Egg,Bob_Routine(a4)

Egg:
	bsr	Standart_Hit_Handler
	movem.w	Bob_X_Position(a4),d0-d1	;Jumping on Egg ?
	move.w	d0,d2
	add.w	#16,d2
	bsr	check_foot_frame
	beq.s	.no

	tst.b	T_state
	bpl.s	.no				;Spieler springt nicht drauf!

		st	T_force_jump		;Force jump of player
		move.w	#4,Bob_Hit(a4)
		subq.b	#1,Ejumps(a4)
		bpl.s	.no
		bra.s	.destruct
.no:

	tst.b	Ehiten(a4)				;Hit enabled ?
	bne.s	.enabled
		move.w	#10,Bob_Power(a4)
		bra.s	.disabled
.enabled:
		tst.w	Bob_Power(a4)			;Destroyed ?
		bne.s	.disabled

;			PLAY_FX	#13
.destruct:
			subq.w	#8,Bob_X_Position(a4)
			moveq	#$20,d0
			bra	Standart_Destruction

.disabled:
	move.w	T_posX,d0			;Calc distance to player
	move.w	T_posY,d1
	add.w	#16,d0
	add.w	#24,d1
	add.w	Scr_X_Level_Pos(a6),d0
	add.w	Scr_Y_Level_Pos(a6),d1
	movem.w	Bob_X_Position(a4),d2-d3
	addq.w	#8,d2
	addi.w	#12,d3
	sub.w	d2,d0
	bpl.s	.ok1
		neg.w	d0
.ok1:
	sub.w	d3,d1
	bpl.s	.ok2
		neg.w	d1
.ok2:
	cmpi.w	#70,d0				;Player in range ?
	bge.s	.not_in_range
		tst.b	Ehatching(a4)
		bne.s	.no_check
		cmpi.w	#48,d1
		slt	Ehatching(a4)		;Set hatching-flag
.no_check:
		cmpi.w	#50,d0
		bge.s	.not_in_range
			st	Ehiten(a4)	;Player near -> enable hit
.not_in_range
	tst.b	Ehatching(a4)			;Hatching active ?
	beq	.no_hatching
		cmpi.w	#2,E_PHA(a4)		;Allready open ?
		bne	.not_open
			tst.b	Ehatched(a4)	;Alien allready exited ?
			bne.s	.no_hatching
			st	Ehiten(a4)
			st	Ehatched(a4)	;No, set flag
		move.l	a4,-(sp)
			movem.w	Bob_X_Position(a4),d1-d2
			moveq	#17,d0
			lea	Area_Enter_Vector(pc),a1
			bsr	Search_Bob_Entry

			move.l	#Alien,Bob_Routine(a4)
			move.w	#2,E_PHA(a4)
			move.b	#BOB_NOPLCOL,Bob_Used(a4)

			move.w	#10,Bob_Power(a4)
			st	Ejump(a4)
			clr.w	Eaylow(a4)
			move.l	#5<<16,Eaydir(a4)
			sf	Ewalk(a4)
			bsr	calc_xdir	;Calc direction to player
			move.w	d7,Eaxdir(a4)
			bsr	set_spr		;Set correct image

		move.l	(sp)+,a4
	bra.s	.no_hatching
.not_open:
			subq.w	#1,Edelay(a4)	;Not yet open -> Inc phase
			bpl.s	.no_hatching
				move.w	#11,Edelay(a4)
				addq.w	#1,E_PHA(a4)
				bsr	Get_Next_Bob_Frame
.no_hatching:

	bra	Test_Bob_Out

Egg_AnimTable:
	dc.l	level_GFX+bob15,level_GFX+msk15
	dc.w	0,0,21,2,2,12,18
	dc.l	level_GFX+bob16,level_GFX+msk16
	dc.w	0,-1,22,2,2,12,18
	dc.l	level_GFX+bob17,level_GFX+msk17
	dc.w	0,-1,22,2,2,12,18

Alien:
	move.l	#$100,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction
;		subq.w	#8,O_XPOS(a5)
;		subq.w	#8,O_YPOS(a5)


	movem.w	Bob_X_Position(a4),d0-d1	;Any walls ?
	tst.w	Eaxdir
	bmi.s	.no_add
		addq.w	#8,d0
.no_add:
	addq.w	#4,d1
	bsr	check_obj_kollision
	beq.s	.no_wall
		neg.w	Eaxdir(a4)		;Yes, just turn around
.no_wall:
	tst.b	Ejump(a4)			;Jumping ?
	beq	.not_jumping
		move.l	Eaydir(a4),d0		;Do Y-movement
		sub.w	d0,Eaylow(a4)
		swap	d0
		move.w	Bob_Y_Position(a4),d1
		subx.w	d0,d1
		move.w	d1,Bob_Y_Position(a4)

		cmpi.w	#-5,Eaydir(a4)		;Slow down in y-speed
		ble.s	.ok
			subi.l	#$00004800,Eaydir(a4)
.ok:
		move.b	T_wheel,d0		;Any problems in sugging ?
;		or.b	pl_shield.w,d0
;		or.b	pl_jump.w,d0
;		or.b	pl_fall.w,d0
;		or.b	pl_dieing.w,d0
		bne	.no_col			;No, so test if collision with face
			move.w	T_posX,d4
			move.w	T_posY,d5
			add.w	Scr_X_Level_Pos(a6),d4
			add.w	Scr_Y_Level_Pos(a6),d5
			tst.b	T_face
			bne.s	.right
				addq.w	#6,d4
			bra.s	.left
.right:
				addi.w	#16,d4
.left:
			addi.w	#13,d5

;			tst.b	pl_duck.w
;			.if (not zero) {
;				addi.w	#10,d5
;			}

			move.w	d4,d6
			move.w	d5,d7
			addi.w	#10,d6
			addi.w	#10,d7

			movem.w	Bob_X_Position(a4),d0-d1
			addq.w	#6,d0
			addq.w	#6,d1
			move.w	d0,d2
			move.w	d1,d3
			addq.w	#8,d2
			addq.w	#8,d3

			cmp.w	d6,d0
			bgt.s	.no_col
			cmp.w	d4,d2
			blt.s	.no_col
			cmp.w	d7,d1
			bgt.s	.no_col
			cmp.w	d5,d3
			blt.s	.no_col

			move.l	#grabber_player,Bob_Routine(a4)	;Face is hit by alien
			move.b	T_face+1,Eold_face(a4)
			sf	Ehugger_times(a4)
;			sf	O_SHOW(a5)
;			sf	O_COLEN(a5)
			sf	Epower_flag(a4)
;			addq.b	#1,hugger_cnt
			rts
.no_col:

		movem.w	Bob_X_Position(a4),d0-d1		;Check backgnd-collision
		addq.w	#6,d0
		tst.w	Eaydir(a4)
		bpl	.lab0
			addi.w	#16,d1
.lab0:
		bsr	check_obj_kollision
		beq	.do_xdir
		tst.w	Eaydir(a4)		;Turn around, if wall detected
		bmi.s	.lab1
			neg.l	Eaydir(a4)
			bra	.do_xdir
.lab1:
		sf	Ejump(a4)		;Stop jump, if ground is reached

	bra	.do_xdir
.not_jumping:
						;Walking around...
		bsr	set_spr			;Set images
		move.w	Bob_X_Position(a4),d1
		sub.w	Scr_X_Level_Pos(a6),d1
		tst.w	Eaxdir(a4)		;Check if player is in right
		bpl.s	.lab2
			move.w	d1,d0
			sub.w	T_posX,d0
			subq.w	#8,d0
			bmi.s	.no_jmp
		bra.s	.lab3
.lab2:
			move.w	T_posX,d0
			sub.w	d1,d0
			addq.w	#8,d0
			bmi.s	.no_jmp
.lab3:
		cmpi.w	#31,d0
		bge.s	.no_jmp
			cmpi.w	#15,d0
			bgt.s	.start_jump	;Yes, he is: Start jump
.no_jmp:
		andi.w	#1,E_PHA(a4)		;Walk animation
		tst.w	Eaxdir(a4)
		beq.s	.no_anim
			subq.b	#1,Ewalk(a4)
			bpl.s	.no_anim
				move.b	#6,Ewalk(a4)	;11
				eori.w	#1,E_PHA(a4)
.no_anim:
		movem.w	Bob_X_Position(a4),d0-d1	;Ground still ok. ?
		addq.w	#4,d0
		addi.w	#16,d1
		movem.w	d0-d1,-(sp)
		bsr	check_slope_kollision
		movem.w	(sp)+,d0-d1
		bne.s	.ground
		addq.w	#8,d0
		jsr	check_slope_kollision
		bne.s	.ground
.start_jump:		st	Ejump(a4)	;No, jump over the gap...
			move.w	#2,E_PHA(a4)
			move.l	#5<<16,Eaydir(a4)
			clr.w	Eaylow(a4)
			bra.s	.do_xdir

.ground:		movem.w	Bob_X_Position(a4),d0-d1	;Yes, calc right position on ground
			addq.w	#8,d0
			addi.w	#16,d1
			bsr	calc_position
			subi.w	#16,d1
			move.w	d1,Bob_Y_Position(a4)
.do_xdir:

	move.w	Eaxdir(a4),d0		;Do x-movement
	add.w	d0,Bob_X_Position(a4)

.end_alien:				;Still on screen ?
	move.w	E_PHA(a4),d0
	mulu	#22,d0
	tst.w	Eaxdir(a4)
	bmi.s	.aleft
	add.l	#Alien_AnimTable_R,d0
	bra.s	.aright
.aleft:
	add.l	#Alien_AnimTable_L,d0
.aright:
	move.l	d0,Bob_Next_Anim(a4)

	bsr	Get_Next_Bob_Frame

	bra	Test_Bob_Out

calc_xdir:				;Calc x-direction of alien
	move.w	T_posX,d0
	add.w	Scr_X_Level_Pos(a6),d0
	addq.w	#8,d0
	cmp.w	Bob_X_Position(a4),d0
	ble.s	.not_greater
		moveq	#1,d7
	bra.s	.greater
.not_greater:
		moveq	#-1,d7
.greater:
	sub.w	Bob_X_Position(a4),d0
	bpl.s	.ok
		neg.w	d0
.ok:
	rts

set_spr:				;Select right info-structure
;	tst.w	Eaxdir(a4)
;	.if (minus) {
;		lea	alien_spr0(pc),a0
;	} .else {
;		lea	alien_spr1(pc),a0
;	}
;	move.l	a0,O_INFO(a5)
;	st	O_SHOW(a5)
	rts

Alien_Flip	= level_Buffer-bob0c+bob11-bob18

Alien_AnimTable_R:
	dc.l	Alien_Flip+bob1a,Alien_Flip+msk1a
	dc.w	0,3,13,2,5,12,10
	dc.l	Alien_Flip+bob1b,Alien_Flip+msk1b
	dc.w	0,3,13,2,5,12,10
	dc.l	Alien_Flip+bob19,Alien_Flip+msk19
	dc.w	0,0,16,2,2,12,12
Alien2_AnimTable_R:
	dc.l	Alien_Flip+bob18,Alien_Flip+msk18
	dc.w	0,0,16,2,2,12,12

Alien_AnimTable_L:
	dc.l	level_GFX+bob1a,level_GFX+msk1a
	dc.w	0,3,13,2,5,12,10
	dc.l	level_GFX+bob1b,level_GFX+msk1b
	dc.w	0,3,13,2,5,12,10
	dc.l	level_GFX+bob19,level_GFX+msk19
	dc.w	0,0,16,2,2,12,12
Alien2_AnimTable_L:
	dc.l	level_GFX+bob18,level_GFX+msk18
	dc.w	0,0,16,2,2,12,12

Alien3_AnimTable:
	dc.l	level_GFX+bob1a+12*2*3,level_GFX+msk1a+12*2
	dc.w	0,0,13,2,5,12,10

		rsset	Bob_Special_1
Ehugger_times	rs.b	1
Eold_face	rs.b	1
Epower_flag	rs.b	1

grabber_player:					;New player-handler
;	tst.b	pl_super.w			;Super-Weapon active ?
;	bne.s	fall_off			;Yes, fall off

;	tst.b	pl_shield.w			;Shield on ?
;	bne.s	fall_off			;Yes, fall off

	move.b	T_swing,d0			;Any rope ?
	or.b	T_rope,d0
	beq.s	.no_check
		tst.b	T_energy		;Power down ?
		bne.s	.no_check
			sf	T_rope		;Cut rope...
			sf	T_swing
;			clr.w	pl_count.w

.no_check:
	bsr	calc_alien
	movem.w	d0-d1,Bob_X_Position(a4)


	subq.b	#1,Epower_flag(a4)		;Time to power down ?
	bpl.s	.no_sub
		addq.b	#3,Epower_flag(a4)
		moveq	#1,d0
		bsr	sub_energy			;Yes...
.no_sub:
	move.w	T_face,d0			;Handle hugger-fall-off
	cmp.b	Eold_face(a4),d0
	beq.s	.end

		move.b	d0,Eold_face(a4)
		addq.b	#1,Ehugger_times(a4)
		cmpi.b	#4,Ehugger_times(a4)
		blt.s	.end
.fall_off:
			tst.w	T_face
;			.if (zero) {
;				lea	alien_spr0(pc),a1
;			} .else {
;				lea	alien_spr1(pc),a1
;			}
;			move.l	a1,O_INFO(a5)
;			st	O_SHOW(a5)
;			sf	O_USR0(a5)
			bsr	calc_alien
			addq.w	#8,d0
			addq.w	#8,d1
			movem.w	d0-d1,Bob_X_Position(a4)
			move.l	#handle_fall,Bob_Routine(a4)
			move.w	#5,Bob_Power(a4)

			lea	Egg_Info_2(pc),a0
			sub.l	a4,a0
			move.w	a0,Bob_to_Info_Offs(a4)
			or.w	#FLIP,Bob_Race(a4)

			move.l	#Alien3_AnimTable,Bob_Next_Anim(a4)
			bsr	Get_Next_Bob_Frame

			clr.w	Bob_Special_1(a4)

;			st	O_COLEN(a5)
;			sf	O_PHITEN(a5)
;			subq.b	#1,hugger_cnt
			rts
.end:
	lea	Alien2_AnimTable_R(pc),a0
	tst.w	T_face
	beq.s	.ok
	lea	Alien2_AnimTable_L(pc),a0
.ok:
	move.l	a0,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame


	IFEQ	custom

handle_player5:
	tst.b	hugger_cnt
	.if (zero) {
		jmp	handle_player.w
	}
	move.l	spr_ptr.w,a0			;Reserve space for space-hugger
	move.w	spr_num.w,d3
	move.b	d3,-5(a0)
	pea	(a0)
	clr.l	(a0)+
	clr.l	(a0)+
	addq.b	#1,d3
	move.l	a0,spr_ptr.w
	move.w	d3,spr_num.w

	move.b	wheel_stat.w,-(sp)		;Handle player (no wheel!)
	sf	wheel_stat.w
	jsr	handle_player.w
	move.b	(sp)+,wheel_stat.w

	move.l	(sp)+,a0
	move.l	#$05002000|(aliens511/32),d2
	tst.b	pl_face.w
	.if (not zero) {
		ori.w	#$0800,d2
	}
	bsr	calc_alien
	addi.w	#128+8,d0
	addi.w	#128+8,d1
	move.w	d1,(a0)+
	or.l	d2,(a0)+
	move.w	d0,(a0)
	rts
	ENDC

calc_alien:
	move.w	T_posX,d0			;Show face-hugger
	move.w	T_posY,d1
	addq.w	#1,d1
	cmp.w	#22,T_anim
	beq.s	.kneeing
	cmp.w	#25,T_anim
	bge.s	.kneeing
		sub.w	#9,d1
.kneeing:
	add.w	#9,d0

;	cmpi.w	#27,pl_phase.w
;	.if (equal) {
;		subq.w	#5,d1
;	}
	add.w	Scr_X_Level_Pos(a6),d0
	add.w	Scr_Y_Level_Pos(a6),d1

	rts

handle_fall:
	moveq	#0,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	tst.b	Bob_Special_1(a4)
	bne	Test_Bob_Out
	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#8,d0
	addi.w	#12,d1
	bsr	check_slope_kollision
	beq.s	.fall
		movem.w	Bob_X_Position(a4),d0-d1
		addq.w	#8,d0
		addi.w	#12,d1
		bsr	calc_position
		subi.w	#12,d1
		move.w	d1,Bob_Y_Position(a4)
		st	Bob_Special_1(a4)
		bra	Test_Bob_Out
.fall:
	addq.w	#4,Bob_Y_Position(a4)
	bra	Test_Bob_Out


*---------------------------------------------------------------------------
*	Routine and AnimTable of     Pfeil
*---------------------------------------------------------------------------
P_REINIT	= 7

Start_Pfeil:
	btst	#P_REINIT,Bob_Special_4+1(a4)
	beq.s	.first_init
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Pfeil,Bob_Routine(a4)
	clr.w	Bob_Special_1(a4)
	move.w	Bob_Special_4(a4),d0
	and.w	#3,d0
	btst	#1,d0
	beq.s	.init_ok
	lea	Explo_Info_1(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
.init_ok:
	mulu	#22,d0
	add.l	#Pfeil_AnimTable,d0
	move.l	d0,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame
.first_init:
	move.l	Bob_Entry_Adress(a4),a0
	or.w	#1<<P_REINIT,6(a0)
	bra	Out_Bob
Pfeil:
	subq.w	#1,Bob_Special_1(a4)
	bpl	Test_Bob_Out
	move.w	#25,Bob_Special_1(a4)
	eor.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	bra	Test_Bob_Out

Pfeil_AnimTable:
	dc.l	level_GFX+bob11,level_GFX+msk11
	dc.w	0,0,20,0,0,0,0

	dc.l	level_GFX+bob12,level_GFX+msk12
	dc.w	0,0,20,0,0,0,0

	dc.l	level_GFX+bob13,level_GFX+msk13
	dc.w	0,0,7,0,0,0,0

	dc.l	level_GFX+bob14,level_GFX+msk14
	dc.w	0,0,7,0,0,0,0


*---------------------------------------------------------------------------
*	Routine and AnimTable of     Dog
*---------------------------------------------------------------------------
DSTAND	equ	0
DRUN	equ	4
DJUMP	equ	8
DTURN	equ	12
DFALL	equ	16

	rsset	Bob_Special_1			;Dog
Dpara	rs.b	1
Dmode	rs.b	1
Duser0	rs.w	1
Duser1	rs.w	1
Dspr	rs.l	1
Ddinit	rs.b	1
Dspeed	rs.b	1
Dshots	rs.b	1

Start_Dog:					;Welt 4

	move.w	#$0402,Bob_Special_4(a4)

	move.b	Bob_Special_4(a4),Dpara(a4)			;Set all parameters
	move.b	Bob_Special_4+1(a4),Dspeed(a4)
	move.w	#5,Bob_Status(a4)
	move.b	#DSTAND,Dmode(a4)
	st	Ddinit(a4)
	move.w	#14,Bob_Power(a4)
	sf	Dshots(a4)
	move.l	#Dog,Bob_Routine(a4)

Dog:
	move.l	#$200,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	move.l	Dspr(a4),a0
	btst	#3,Dpara(a4)
	beq	.no_shots

		subq.b	#1,Dshots(a4)		;Delay down ?
		bpl	.no_shots		;Yes, start shot...
			move.b	#80,Dshots(a4)

;			PLAY_FX	#17

			moveq	#12,d0
			lea	Area_Enter_Vector(pc),a1
			move.l	a4,-(sp)
			bsr	Search_Bob_Entry		;Add slime-object
			move.l	(sp)+,a0

			move.w	#4,Bob_Power(a4)
			sf	Lwait(a4)
			st	Lnocheck(a4)
			bsr	rnd
			andi.w	#3,d0
			subq.w	#6,d0

			move.w	Bob_X_Position(a0),d2		;Which side ?
			addi.w	#24,d2
			sub.w	Scr_X_Level_Pos(a6),d2
			move.w	T_posX,d1
			addi.w	#16,d1
			cmp.w	d2,d1
			ble.s	.slab0
				neg.w	d0
.slab0:
			move.w	d0,Lbxdir(a4)
			clr.w	Lbxdir+2(a4)
			clr.l	Lxlow(a4)
			move.l	Bob_X_Position(a0),Bob_X_Position(a4)
			btst	#1,Dpara(a0)
			beq.s	.slab1
				addi.w	#40,Bob_X_Position(a4)
				bra.s	.slab2
.slab1:
				addq.w	#8,Bob_X_Position(a4)
.slab2:
			addq.w	#8,Bob_Y_Position(a4)
			bsr	rnd
			andi.w	#3,d0
			subq.w	#2,d0
			neg.w	d0
			move.w	d0,Lbydir(a4)
			clr.w	Lbydir+2(a4)

		move.l	a0,a4

.no_shots:

	moveq	#0,d0				;Jump to movement-handler
	move.b	Dmode(a4),d0
	jmp	.mode_tab(pc,d0.w)
.mode_tab:
	bra.w	.dog_wait	;0
	bra.w	.dog_run	;4
	bra.w	.dog_jump	;8
	bra.w	.dog_turn	;12
.dog_fall:			;16		;The dog is falling down
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#20,d0
	addi.w	#32,d1
	bsr	check_slope_kollision
	beq.s	.no_koll
		move.b	#DSTAND,Dmode(a4)
		st	Ddinit(a4)
		bra	.exit_dog
.no_koll:
	addq.w	#4,Bob_Y_Position(a4)
	bra	.exit_dog

.dog_wait:					;The dog awaits its enemy
	bsr	.check_ground
	tst.b	Ddinit(a4)
	beq.s	.no_init1
		move.w	#45,Duser0(a4)
		clr.w	Duser1(a4)
		sf	Ddinit(a4)
		move.w	#5,Bob_Status(a4)
.no_init1:
	tst.w	Duser1(a4)
	bne.s	.do_turn
	move.w	Bob_X_Position(a4),d0
	addq.w	#8,d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	T_posX,d0			;Always look at Turrican
	ble.s	.left
		btst	#1,Dpara(a4)
		beq.s	.ok
		bra.s	.set
.left:
	btst	#1,Dpara(a4)
	bne.s	.ok
.set:
	move.w	#4,Duser1(a4)
	move.w	#4,Bob_Status(a4)
.ok:
	tst.w	Duser1(a4)			;Start running ?
	bne.s	.do_turn
		subq.w	#1,Duser0(a4)
		bpl	.exit_dog
		move.b	#DRUN,Dmode(a4)
		st	Ddinit(a4)
		bra	.exit_dog
.do_turn:
	subq.w	#1,Duser1(a4)			;Handle turn-phases
	bne	.exit_dog
	bchg	#1,Dpara(a4)
	move.w	#5,Bob_Status(a4)
	bra	.exit_dog

.dog_run:					;The dog is running...
	bsr	.check_ground

	tst.b	Ddinit(a4)
	beq.s	.no_init2
		sf	Ddinit(a4)
		clr.w	Bob_Status(a4)
		clr.w	Duser0(a4)
.no_init2:
	subq.w	#1,Duser0(a4)			;Do animation
	bpl.s	.no_anim1
		addq.w	#8,Duser0(a4)
		addq.w	#1,Bob_Status(a4)
		andi.w	#3,Bob_Status(a4)
.no_anim1:
	moveq	#0,d0
	move.b	Dspeed(a4),d0
	btst	#1,Dpara(a4)			;Move dog
	bne.s	.to_right
		neg.w	d0
		moveq	#0,d7
	bra.s	.to_left
.to_right:
		moveq	#40,d7
.to_left:
	add.w	d0,Bob_X_Position(a4)

	btst	#2,Dpara(a4)			;Jump allowed ?
	beq.s	.nojmp
		move.w	T_posX,d0		;Jump on player ?
		add.w	Scr_X_Level_Pos(a6),d0
		sub.w	Bob_X_Position(a4),d0
		btst	#1,Dpara(a4)
		bne.s	.lab1
			cmpi.w	#-50,d0
			bgt.s	.nojmp
			cmpi.w	#-70,d0
			bgt.s	.dojmp
		bra.s	.nojmp
.lab1:
			cmpi.w	#70,d0
			bgt.s	.nojmp
			cmpi.w	#50,d0
			blt.s	.nojmp
.dojmp:
			move.b	#DJUMP,Dmode(a4)
			st	Ddinit(a4)
			move.w	#5,Bob_Status(a4)
			bra	.exit_dog
.nojmp:

	tst.b	d5				;Walking on slopes ?
	bpl	.no_slopes			;-> No ground-check

	movem.w	Bob_X_Position(a4),d0-d1		;Ground ?
	addi.w	#34,d1
	add.w	#20,d0
	bsr	check_slope_kollision
	beq.s	.no_ground
	bra.s	.ground

.no_slopes:
	movem.w	Bob_X_Position(a4),d0-d1		;Ground ?
	addi.w	#32,d1
	add.w	d7,d0
	bsr	check_slope_kollision
	beq.s	.no_ground			;Yes, a wall ?

.ground:	movem.w	Bob_X_Position(a4),d0-d1
		add.w	d7,d0
		addi.w	#16,d1
		bsr	check_obj_kollision
		ble	.exit_dog
		bra.s	.turn			;Yes, turn around...
.no_ground:
	btst	#0,Dpara(a4)			;Jump over the gap or turn around ?
	bne.s	.jumpgap
.turn:		move.b	#DTURN,Dmode(a4)		;Turn
		st	Ddinit(a4)
		bra	.exit_dog
.jumpgap:
	move.b	#DJUMP,Dmode(a4)			;Jump
	st	Ddinit(a4)
	bra	.exit_dog

.dog_jump:
	tst.b	Ddinit(a4)			;Handle jumping...
	beq.s	.no_init3
		sf	Ddinit(a4)
		move.w	#4,Duser0(a4)
		clr.w	Duser1(a4)
		clr.w	Bob_Status(a4)
.no_init3:
	move.b	Duser1+1(a4),d0
	sub.b	d0,Duser1(a4)
	move.w	Bob_Y_Position(a4),d0
	move.w	Duser0(a4),d1
	subx.w	d1,d0
	move.w	d0,Bob_Y_Position(a4)
	cmpi.w	#-6,Duser0(a4)			;Fast enough (down) ?
	ble.s	.no_speedup
		subi.b	#$40,Duser1+1(a4)	;No, speed up...
		moveq	#0,d0
		subx.w	d0,d1
		move.w	d1,Duser0(a4)

.no_speedup:
	tst.w	Duser0(a4)			;Going up ?
	bmi.s	.no_headcheck
		movem.w	Bob_X_Position(a4),d0-d1	;Check for ceiling...
		addq.w	#8,d0
		addq.w	#8,d1
		movem.w	d0-d1,-(sp)
		bsr	check_obj_kollision
		movem.w	(sp)+,d0-d1
		bne.s	.ceiling
		addi.w	#32,d0
		bsr	check_obj_kollision
		beq.s	.no_headcheck
.ceiling:
			clr.w	Duser0(a4)	;Stop movement...
			sf	Duser1+1(a4)

.no_headcheck:
	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#8,d1
	btst	#1,Dpara(a4)			;Which x-dir ?
	bne.s	.lab2
		moveq	#-2,d7
	bra.s	.lab3
.lab2:
		moveq	#2,d7
		addi.w	#44,d0
.lab3:
	movem.w	d0-d1,-(sp)			;Is there any wall out there ?
	bsr	check_slope_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.ground2
	addq.w	#8,d1
	bsr	check_slope_kollision
	bne.s	.ground2
		add.w	d7,Bob_X_Position(a4)		;No, do movement
.ground2:

	tst.w	Duser0(a4)			;Down ?
	bpl	.exit_dog

	movem.w	Bob_X_Position(a4),d0-d1		;Yes, look for ground...
	addi.w	#12,d0
	addi.w	#32,d1
	bsr	check_slope_kollision
	bne.s	.stop
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#28,d0
	addi.w	#32,d1
	bsr	check_slope_kollision
	beq	.exit_dog
.stop:
	move.b	#DSTAND,Dmode(a4)			;Ground detected -> Stand
	st	Ddinit(a4)
	bra	.exit_dog

.dog_turn:
	tst.b	Ddinit(a4)			;Let dog turn slowly...
	beq.s	.no_init4
		sf	Ddinit(a4)
		move.w	#20,Duser0(a4)
		move.w	#4,Bob_Status(a4)
.no_init4:
	subq.w	#1,Duser0(a4)
	bpl.s	.exit_dog
		bchg	#1,Dpara(a4)
		move.b	#DRUN,Dmode(a4)
		st	Ddinit(a4)
.exit_dog:					;Still on screen ?
	move.w	Bob_Status(a4),d0
	btst	#1,Dpara(a4)
	beq.s	.dir_ok
	addq.w	#6,d0
.dir_ok:
	add.w	d0,d0

	lea	.dog_tab(pc),a0
	move.b	.dog_tab2-.dog_tab(a0,d0.w),Bob_Height+1(a4)
	move.b	.dog_tab2-.dog_tab+1(a0,d0.w),Bob_Y_Offset+1(a4)
	asl.w	#2,d0

	move.l	(a0,d0.w),Bob_Graphics(a4)
	move.l	4(a0,d0.w),Bob_Mask(a4)

	bra	Test_Bob_Out

Dog_Flip	= level_Buffer-bob0c

.dog_tab:
	dc.l	level_GFX+bob0d,level_GFX+msk0d
	dc.l	level_GFX+bob0e,level_GFX+msk0e
	dc.l	level_GFX+bob0f,level_GFX+msk0f
	dc.l	level_GFX+bob0e,level_GFX+msk0e
	dc.l	level_GFX+bob10,level_GFX+msk10
	dc.l	level_GFX+bob0c,level_GFX+msk0c

	dc.l	Dog_Flip+bob0d,Dog_Flip+msk0d
	dc.l	Dog_Flip+bob0e,Dog_Flip+msk0e
	dc.l	Dog_Flip+bob0f,Dog_Flip+msk0f
	dc.l	Dog_Flip+bob0e,Dog_Flip+msk0e
	dc.l	Dog_Flip+bob10,Dog_Flip+msk10
	dc.l	Dog_Flip+bob0c,Dog_Flip+msk0c

.dog_tab2:
	dc.b	29,0,32,0,32,0,32,0,29,3,32,0
	dc.b	29,0,32,0,32,0,32,0,29,3,32,0

.check_ground:					;Check if fall is neccessary
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#12,d0
	addi.w	#32,d1
	moveq	#0,d5
	movem.w	d0-d1,-(sp)
	bsr	check_slope_kollision
	beq.s	.no_slope
	moveq	#1,d5				;Mindestens Boden!
	and.b	#%00110000,d1
	beq.s	.no_slope
	st	d5				;Schrge!
.no_slope:
	movem.w	(sp)+,d0-d1
	addi.w	#16,d0
	bsr	check_slope_kollision
	bne	.ground3			;Any ground ?
	tst.b	d5
	beq.s	.fall				;Beides 0.
.ground3:	and.w	#%00110000,d1		;Get the negative one into d5
		beq.s	.no_slope3
		st	d5			;Mindestens eine Schrge!
.no_slope3:
		movem.w	Bob_X_Position(a4),d0-d1
		addi.w	#20,d0
		addi.w	#32,d1
		bsr	calc_position
		subi.w	#32,d1
		move.w	d1,Bob_Y_Position(a4)
	rts

.fall:
		move.b	#DFALL,Dmode(a4)
		st	Ddinit(a4)
		addq.l	#4,sp
		bra	.exit_dog
	rts

;.check_ground:					;Check if fall is neccessary
;	movem.w	Bob_X_Position(a4),d0-d1
;	addi.w	#12,d0
;	addi.w	#32,d1
;	movem.w	d0-d1,-(sp)
;	bsr	check_slope_kollision
;	sne	d0
;	move.b	d0,d5
;	movem.w	(sp)+,d0-d1
;	bne	.ground3
;	addi.w	#16,d0
;	bsr	check_slope_kollision
;	bne	.ground3				;Any ground ?
;	tst.b	d5
;	beq.s	.fall
;	bra.s	.no_slope
;.ground3:
;	sf	d5
;	and.b	#%00110000,d1
;	beq.s	.no_slope
;	st	d5
;.no_slope:
;		movem.w	Bob_X_Position(a4),d0-d1
;		addi.w	#20,d0
;		addi.w	#32,d1
;		bsr	calc_position
;		subi.w	#32,d1
;		move.w	d1,Bob_Y_Position(a4)
;	rts
;.fall:
;	move.b	#DFALL,Dmode(a4)
;	st	Ddinit(a4)
;	addq.l	#4,sp
;	bra	.exit_dog

Dog_AnimTable:
		dc.l	level_GFX+bob0c,level_GFX+msk0c
		dc.w	0,0,32,4,4,24,24

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Roller
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Rangle	rs.b	1
Rtdir	rs.b	1
Rdir	rs.w	1
Rxmin	rs.w	1
Rxmax	rs.w	1
Rshots	rs.w	1
Rflags	rs.b	1

Start_Roller:
	move.b	Bob_Special_4+1(a4),Rflags(a4)			;Get range-flags etc.
	sf	Rangle(a4)
	move.b	#3,Rtdir(a4)			;Roll to the left
	move.w	#-2,Rdir(a4)
;	movem.w	2(a0),d0-d1
	moveq	#100,d0
	moveq	#-100,d1
	cmp.w	d0,d1
	bge.s	.ok
		exg	d0,d1
.ok:
	add.w	Bob_X_Position(a4),d0
	add.w	Bob_X_Position(a4),d1
	movem.w	d0-d1,Rxmin(a4)
	clr.w	Rshots(a4)
	move.l	#Roller,Bob_Routine(a4)

Roller:
	move.l	#$110,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	btst	#1,Rflags(a4)
	beq.s	.no_boundary_check
		movem.w	Rxmin(a4),d2-d3		;Check movement bounderies
		cmp.w	Bob_X_Position(a4),d2
		bgt.s	.turn
		cmp.w	Bob_X_Position(a4),d3
		blt.s	.turn

.no_boundary_check:

	movem.w	Bob_X_Position(a4),d0-d1		;Wall detected ?
	addi.w	#10,d1
	tst.b	Rdir(a4)
	bmi.s	.to_left
		addi.w	#24,d0
.to_left:
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.turn
	addq.w	#8,d1
	bsr	check_obj_kollision
	bne.s	.turn

	movem.w	Bob_X_Position(a4),d0-d1		;Ground ?
	addi.w	#12,d0
	tst.b	Rdir(a4)
	bmi.s	.to_left2
	addq.w	#8,d0
.to_left2:
	addi.w	#32,d1
	movem.w	d0-d1,-(sp)
	bsr	check_slope_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.ground
	addq.w	#4,d1
	bsr	check_slope_kollision
	bne.s	.ground
.turn:		neg.w	Rdir(a4)
		neg.b	Rtdir(a4)
	bra.s	.move
.ground:	movem.w	Bob_X_Position(a4),d0-d1	;Calc ground-pos.
		addi.w	#32,d1
		addi.w	#16,d0
		bsr	calc_position
		subi.w	#32,d1
		move.w	d1,Bob_Y_Position(a4)
.move:
	move.w	Rdir(a4),d0			;Move alien
	add.w	d0,Bob_X_Position(a4)
	move.b	Rtdir(a4),d0
	add.b	d0,Rangle(a4)

;	btst	#0,flags(a5)
;	.if (not zero) {
;		subq.w	#1,shots(a5)		;Delay down ?
;		.if (minus) {			;Yes, start shot...
;			move.w	#80,shots(a5)
;			PLAY_FX	#16
;			movem.w	pl_xpos.w,d6-d7	;Angle to player
;			addi.w	#16,d6
;			addi.w	#24,d7
;			jsr	calc_angle.w
;			moveq	#127,d7
;			sub.b	d1,d7
;			move.b	d7,d0
;			jsr	sin.w
;			move.w	d0,d3
;			move.b	d7,d0
;			jsr	cos.w
;			move.w	d0,d2
;			asr.w	#2,d2
;			asr.w	#2,d3
;			movem.w	O_XPOS(a5),d0-d1
;			addq.w	#8,d0
;			addq.w	#8,d1
;			tst.w	O_USR1(a5)		;Walking right ?
;			.if (plus) {
;				addi.w	#16,d0
;			}
;			jsr	add_bullet.w
;		}
;	}

	moveq	#0,d0
	move.b	Rangle(a4),d0
	and.w	#$fff8,d0
	asl.w	#6,d0
	add.l	#Rotate2,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#384,d0
	move.l	d0,Bob_Mask(a4)

	bra	Test_Bob_Out

Roller_AnimTable:
		dc.l	level_GFX+bob0b,level_GFX+msk0b
		dc.w	0,0,32,4,4,24,24


*---------------------------------------------------------------------------
*	Routine and AnimTable of     Slime
*---------------------------------------------------------------------------

	rsset	Bob_Special_1
Sspeed	rs.l	1
Sylow	rs.w	1
Sdelay	rs.b	1

Start_Slime:
	bsr	rnd
	andi.b	#7,d0
	move.b	d0,Sdelay(a4)
	clr.l	Sspeed(a4)
	clr.w	Sylow(a4)
	move.l	#Slime,Bob_Routine(a4)

Slime:
	moveq	#$30,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	subq.b	#1,Sdelay(a4)
	bpl.s	.no_anim
		addq.b	#8,Sdelay(a4)
		bsr	Get_Next_Bob_Frame
.no_anim:
	move.w	Bob_Y_Position(a4),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	addq.w	#8,d0
	cmp.w	T_posY,d0
	bge.s	.out
		move.w	T_posX,d0
		add.w	Scr_X_Level_Pos(a6),d0
		sub.w	Bob_X_Position(a4),d0
		bpl.s	.no_neg
			neg.w	d0
.no_neg:
		cmpi.w	#16,d0
		bge.s	.out
			move.l	#Slime_AnimTable2,Bob_Next_Anim(a4)
			move.l	#.slime_fall,Bob_Routine(a4)
			bsr	Get_Next_Bob_Frame
.out:
	bra	Test_Bob_Out

.slime_fall:
	moveq	#0,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	move.l	Sspeed(a4),d0
	add.w	d0,Sylow(a4)
	swap	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

	cmpi.w	#6,Sspeed(a4)
	bge.s	.no_speedup
		addi.l	#$00004800,Sspeed(a4)
.no_speedup:
	bsr	check_ballex
	bra	Test_Bob_Out

Slime_AnimTable:
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,0,8,2,2,12,11
		dc.l	level_GFX+bob05,level_GFX+msk05
		dc.w	0,-1,10,2,2,12,11
		dc.w	ENTRY_END
		dc.l	Slime_AnimTable

Slime_AnimTable2:
		dc.l	level_GFX+bob06,level_GFX+msk06
		dc.w	0,-1,10,2,2,12,11

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Beule
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Bdelay		rs.w	1
Bhandler	rs.l	1
Bwackel		rs.b	1
Bshot		rs.b	1
BPHA		rs.w	1

Start_Beule:
	move.w	#60,Bdelay(a4)
	move.l	#beule0,Bhandler(a4)
	move.w	#18,Bob_Power(a4)
	clr.w	BPHA(a4)
	move.l	#Beule,Bob_Routine(a4)

Beule:
	move.l	#$300,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	move.l	Bhandler(a4),a0
	jsr	(a0)

	bra	Test_Bob_Out

beule0:						;Waiting
	subq.w	#1,Bdelay(a4)
	bpl.s	.out
		move.l	#beule1,Bhandler(a4)
		clr.w	Bdelay(a4)
.out:
	rts

beule1:						;Opening
	subq.w	#1,Bdelay(a4)
	bpl.s	.out
		addq.w	#8,Bdelay(a4)
		bsr	Get_Next_Bob_Frame
		addq.w	#1,BPHA(a4)
		cmpi.w	#2,BPHA(a4)
		bne.s	.out
			move.l	#beule2,Bhandler(a4)
			move.w	#100,Bdelay(a4)
			clr.w	Bwackel(a4)
.out:
	rts

beule2:						;Shooting
	subq.b	#1,Bshot(a4)
	bpl	.no_shot

		addq.b	#6,Bshot(a4)

		move.l	a4,-(sp)

		movem.w	Bob_X_Position(a4),d1-d2
		add.w	#16,d1
		addq.w	#8,d2
		moveq	#12,d0
		lea	Area_Enter_Vector(pc),a1
		bsr	Search_Bob_Entry
		sf	Lwait(a4)
		move.b	#15,Lnocheck(a4)
		bsr	rnd
		andi.w	#7,d0
		subq.w	#3,d0
		bpl.s	.add
		subq.w	#1,d0
		bra.s	.sub
.add:
		addq.w	#1,d0
.sub:
		move.w	d0,Lbxdir(a4)
		clr.w	Lbxdir+2(a4)
		clr.l	Lxlow(a4)
		bsr	rnd
		andi.w	#3,d0
		addq.w	#3,d0
		neg.w	d0
		move.w	d0,Lbydir(a4)
		clr.w	Lbydir+2(a4)
		move.l	(sp)+,a4

.no_shot:
	subq.b	#1,Bwackel(a4)
	bpl.s	.no_wackel
		addq.b	#3,Bwackel(a4)
		bsr	Get_Next_Bob_Frame
.no_wackel:
	subq.w	#1,Bdelay(a4)
	bpl.s	.out
		move.l	#beule3,Bhandler(a4)
		clr.w	Bdelay(a4)
		move.w	#2,BPHA(a4)
		move.l	#Beule_AnimTable2,Bob_Next_Anim(a4)
.out:
	rts

beule3:						;Closeing
	subq.w	#1,Bdelay(a4)
	bpl.s	.out
		addq.w	#8,Bdelay(a4)
		bsr	Get_Next_Bob_Frame
		subq.w	#1,BPHA(a4)
		bne.s	.out
			move.l	#beule0,Bhandler(a4)
			move.w	#140,Bdelay(a4)
.out:
	rts


Beule_AnimTable:
		dc.l	level_GFX+bob00,level_GFX+msk00
		dc.w	0,0,16,2,2,12,11
		dc.l	level_GFX+bob01,level_GFX+msk01
		dc.w	0,0,16,2,2,12,11
.lab0:
		dc.l	level_GFX+bob02,level_GFX+msk02
		dc.w	0,0,16,2,2,12,11
		dc.l	level_GFX+bob03,level_GFX+msk03
		dc.w	0,0,16,2,2,12,11
		dc.w	ENTRY_END
		dc.l	.lab0
Beule_AnimTable2:
		dc.l	level_GFX+bob01,level_GFX+msk01
		dc.w	0,0,16,2,2,12,11
		dc.w	ENTRY_END
		dc.l	Beule_AnimTable

	rsset	Bob_Special_1
Lbxdir		rs.l	1
Lbydir		rs.l	1
Lxlow		rs.w	1
Lylow		rs.w	1
Lwait		rs.b	1
Lnocheck	rs.b	1

Ball:
	moveq	#0,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	move.l	Lbxdir(a4),d0
	add.w	d0,Lxlow(a4)
	swap	d0
	move.w	Bob_X_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_X_Position(a4)
	move.l	Lbydir(a4),d0
	add.w	d0,Lylow(a4)
	swap	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

	cmpi.w	#6,Lbydir(a4)
	bge.s	.no_speedup
		addi.l	#$00004800,Lbydir(a4)

.no_speedup:
	not.b	Lwait(a4)
	bne.s	.ok
	bsr	Get_Next_Bob_Frame
.ok:
	bsr	.check_ballex
	bra	Test_Bob_Out

.check_ballex:
	tst.b	Lnocheck(a4)
	bmi.s	check_ballex
	subq.b	#1,Lnocheck(a4)
	rts

check_ballex:
	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#4,d0
	addq.w	#8,d1
	bsr	check_obj_kollision
	beq.s	.out
;			movem.w	O_XPOS(a5),d0-d1
;			addq.w	#8,d0
;			addq.w	#8,d1
;			jsr	calc_position.w

;			subq.w	#8,d1
;			move.w	d1,Bob_Y_Position(a4)
			move.l	#.handle_ballex,Bob_Routine(a4)
			move.l	#Ball_AnimTable2,Bob_Next_Anim(a4)
			sf	Lwait(a4)
			lea	Ball_Info_2(pc),a0
			sub.l	a4,a0
			move.w	a0,Bob_to_Info_Offs(a4)
			subq.w	#8,Bob_X_Position(a4)
.out:
	rts

.handle_ballex:
	subq.b	#1,Lwait(a4)
	bpl.s	.out
		addq.b	#3,Lwait(a4)
		bra	Get_Next_Bob_Frame

Ball_AnimTable:
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,0,8,2,2,12,11
		dc.l	level_GFX+bob05,level_GFX+msk05
		dc.w	0,-1,10,2,2,12,11
		dc.l	level_GFX+bob06,level_GFX+msk06
		dc.w	0,-1,10,2,2,12,11
		dc.w	ENTRY_END
		dc.l	Ball_AnimTable

Ball_AnimTable2:
		dc.l	level_GFX+bob07,level_GFX+msk07
		dc.w	0,0,8,2,2,12,11
		dc.l	level_GFX+bob08,level_GFX+msk08
		dc.w	0,0,8,2,2,12,11
		dc.l	level_GFX+bob09,level_GFX+msk09
		dc.w	0,2,6,2,2,12,11
		dc.l	level_GFX+bob0a,level_GFX+msk0a
		dc.w	0,3,5,2,2,12,11

		dc.w	END_OUT_DAMAGE


*---------------------------------------------------------------------------
*	Routine and AnimTable of     Diamond
*---------------------------------------------------------------------------
Diamond_Start:
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Diamond,Bob_Routine(a4)
	move.w	Bob_X_Position(a4),d0
	and.w	#15,d0
	bne	Diamond
	lea	Diamond_Info_2(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
Diamond:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1

	move.w	T_posX,d2
	move.w	T_posY,d3
	add.w	#10,d2
	addq.w	#4,d3

	move.w	d2,d4
	move.w	d3,d5

	add.w	#18,d4
	add.w	#24,d5

	cmp.w	d4,d0
	bgt	.no_collect

	move.l	Bob_Act_Anim(a4),a0

	add.w	18(a0),d0
	cmp.w	d2,d0
	blt.s	.no_collect

	cmp.w	d5,d1
	bgt.s	.no_collect
	add.w	20(a0),d1
	cmp.w	d3,d1
	blt.s	.no_collect

	addq.w	#1,Diamond_Count

	bra	Out_Bob_Damage

.no_collect:
	tst.b	Bob_Special_1(a4)
	beq.s	.flashing
	subq.w	#1,Bob_Special_2(a4)
	bpl	Test_Bob_Out
	sf	Bob_Special_1(a4)

.flashing:
	subq.b	#1,Bob_Special_3(a4)
	bpl	Test_Bob_Out
	move.b	#2,Bob_Special_3(a4)
	addq.b	#1,Bob_Special_1+1(a4)
	bsr	Get_Next_Bob_Frame
	cmp.b	#4,Bob_Special_1+1(a4)
	bne	Test_Bob_Out
	move.w	#$0100,Bob_Special_1(a4)
	bsr	rnd
	and.w	#511,d0
	move.w	d0,Bob_Special_2(a4)	;Nchster Wait-Wert!
	bra	Test_Bob_Out

Diamond_Count:	dc.w	0

Diamond_AnimTable:
		dc.l	main2_GFX+Cbob29,main2_GFX+Cmsk29
		dc.w	0,0,16,2,2,12,11
		dc.l	main2_GFX+Cbob2a,main2_GFX+Cmsk2a
		dc.w	0,0,16,2,2,12,11
		dc.l	main2_GFX+Cbob2b,main2_GFX+Cmsk2b
		dc.w	0,0,16,2,2,12,11
		dc.l	main2_GFX+Cbob2a,main2_GFX+Cmsk2a
		dc.w	0,0,16,2,2,12,11
		dc.w	ENTRY_END
		dc.l	Diamond_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of     MineExplo
*---------------------------------------------------------------------------
MineExplo:
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	#16,d2
	add.w	#32,d3
	bsr	check_rec
	beq.s	.no_hit
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.powerok
	subq.w	#6,Bob_Power(a0)
	bpl.s	.powerok
	clr.w	Bob_Power(a0)
.powerok:
	move.w	#4,Bob_Hit(a0)
.no_hit:
	bra	Standart_BobAnim

MineExplo_AnimTable:
		dc.l	main2_GFX+Cbob26,main2_GFX+Cmsk26
		dc.w	0,16,16,2,2,12,11
		dc.l	main2_GFX+Cbob27,main2_GFX+Cmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main2_GFX+Cbob28,main2_GFX+Cmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main2_GFX+Cbob27,main2_GFX+Cmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main2_GFX+Cbob28,main2_GFX+Cmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main2_GFX+Cbob27,main2_GFX+Cmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main2_GFX+Cbob28,main2_GFX+Cmsk28
		dc.w	0,0,32,2,2,12,11
		dc.w	END_OUT_DAMAGE


handle_repos1:
	tst.b	T_state
	bne.s	.out
	tst.b	T_hit
	bne.s	.out
	move.w	T_posX,reposX
	move.w	T_posY,reposY
	move.b	T_face,repos_face
.out:
	rts

reposX:	dc.w	0
reposY:	dc.w	0
repos_face:	dc.w	0

Wait_Handler:
	subq.w	#1,Wait_Verz
	bpl.s	.out
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
.out:
	rts

Wait_Verz:	dc.w	0
Zoom_finished:	dc.w	0

Rotate_Handler:
	move.l	Rotate_Routine(pc),a1
	jmp	(a1)

Rotate_Kill:
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
	rts

Rotate_1:
	move.l	#Rotate_2,Rotate_Routine
	move.l	Rotate_Buffer_Pointer,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	move.w	Rotate_Angle,d0
	jmp	Do_Rotate

Rotate_2:
	move.l	#Rotate_3,Rotate_Routine
	move.l	Rotate_Buffer_Pointer,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jmp	Do_Copy

Rotate_3:
	move.l	#Rotate_4,Rotate_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jmp	Convert_to_Bitplane2

Rotate_4:
	move.l	#Rotate_1,Rotate_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4+4*16(a0),a3
	lea	4*16*4(a0),a0

	lea	Work_Buffer2+16*32,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane2

	add.l	#640,Dest_Obj
	move.w	Rotate_Angle_Add,d0
	add.b	d0,Rotate_Angle+1
	bne.s	.out
	move.l	#Rotate_Kill,Rotate_Routine
.out:
	rts

Rotate_Angle:		dc.w	0
Rotate_Angle_Add:	dc.w	0
Rotate_Routine:		dc.l	Rotate_1
Rotate_Buffer_Pointer:	dc.l	0


*---------------------------------------------------------------------------
*	Routine and AnimTable of      CuePoint
*---------------------------------------------------------------------------

CuePointStart:
	move.l	#CuePoint,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)

CuePoint:
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	#100,d2
	moveq	#0,d4
	move.b	Bob_Special_4+1(a4),d4
	lsl.b	#4,d4
	sub.w	d4,d1			;Die Obere Grenze berechnen.

	move.w	T_posX(pc),d4
	add.w	#10,d4
	cmp.w	d2,d4
	bgt.s	.no_kolli
	add.w	#18,d4
	cmp.w	d0,d4
	blt.s	.no_kolli
	move.w	T_posY(pc),d4
	addq.w	#4,d4
	cmp.w	d3,d4
	bgt.s	.no_kolli
	add.w	#24,d4
	cmp.w	d1,d4
	blt.s	.no_kolli
	move.b	Bob_Special_4(a4),Cue_Point+1
.no_kolli:
	bra	Test_Bob_Out2

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Rocket
*---------------------------------------------------------------------------

RSPEED	= 8

start_rocket:
	cmp.b	#2,T_rocket_anz
	beq.s	.out				;Schon genug Raketen!

	moveq	#6,d0
	bsr	.get_origin		;Get start-position

	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	tst.w	d7
	bmi.s	.out
	tst.b	T_face			;Which direction ?
	beq.s	.to_left
	moveq	#RSPEED<<1,d0	;Right
	move.b	#128,d1
	bra.s	.set
.to_left:
	moveq	#-RSPEED<<1,d0	;Left
	moveq	#0,d1
.set:
	clr.w	Bob_Anim_Delay(a4)
	move.w	d0,Bob_Special_1(a4)
	clr.w	Bob_Special_2(a4)
	move.b	d1,Bob_Special_3(a4)
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	asl.w	#3,d0
	asl.w	#3,d1
	movem.w	d0-d1,Bob_Special_4(a4)	;Store in fix-format
	sf	Bob_Special_3+1(a4)		;Clear counter
	move.b	#BOB_NOCOL,Bob_Used(a4)
	addq.b	#1,T_rocket_anz
.out:
	rts

.get_origin:
	move.w	T_posX,d1
	move.w	T_posY,d2
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	tst.w	T_face
	beq.s	.ok
	add.w	#16,d1
.ok:
	cmp.w	#22,T_anim
	bne.s	.no_knee
	add.w	#16,d2
.no_knee:
	rts

Rocket:
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	#16,d2
	add.w	#16,d3
	bsr	check_rec
	beq.s	.no_hit
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.powerok
	move.w	SW_power,d0
	sub.w	d0,Bob_Power(a0)
	bpl.s	.powerok
	clr.w	Bob_Power(a0)
.powerok:
	move.w	#4,Bob_Hit(a0)

.end_rocket:					;make explosion (free rocket)
	subq.b	#1,T_rocket_anz
	sub.w	#16,Bob_X_Position(a4)
	sub.w	#16,Bob_Y_Position(a4)
	bsr	Out_Bob_Damage
	bsr	Start_Explo
	move.w	#0,Bob_Anim_Delay_Init(a4)
	rts
.no_hit:

	movem.w	Bob_Special_1(a4),d0-d1		;Get direction
	add.w	d0,Bob_Special_4(a4)		;Add to position
	add.w	d1,Bob_Special_5(a4)

	movem.w	Bob_Special_4(a4),d0-d1		;Convert position to normal format
	asr.w	#3,d0
	asr.w	#3,d1
	add.w	Scr_X_Level_Pos(a6),d0
	add.w	Scr_Y_Level_Pos(a6),d1
	movem.w	d0-d1,Bob_X_Position(a4)	;Store into object's position

	moveq	#0,d0
	move.b	Bob_Special_3(a4),d0			;Get angle
	addq.w	#8,d0				;Round result to 16-border
	lsr.w	#4,d0
	subq.w	#8,d0
	andi.w	#15,d0				;Mask lower 4 bits
	move.w	d0,Bob_Anim_Delay(a4)		;Take as phase
	add.w	d0,d0
	move.w	d0,d6
	add.w	d0,d0
	add.w	d0,d6
	asl.w	#2,d0
	add.w	d0,d6
	lea	Rocket_AnimTable(pc),a0
	lea	(a0,d6.w),a0
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame

	cmp.w	#8,Bob_Anim_Delay(a4)
	ble.s	.set_noflip
	lea	Rocket_Info_2(pc),a0
	sub.l	a4,a0
	or.w	#FLIP,Bob_Race(a4)
	bra.s	.setit
.set_noflip:
	lea	Rocket_Info_1(pc),a0
	sub.l	a4,a0
	and.w	#$ffff-FLIP,Bob_Race(a4)
.setit:
	move.w	a0,Bob_to_Info_Offs(a4)

	subq.b	#1,Bob_Special_3+1(a4)		;Time out ?
	bpl.s	.no_timeout
	move.b	#55,Bob_Special_3+1(a4)
	bsr	rnd
	move.w	d0,d6
	bsr	rnd
	andi.w	#$03ff,d0
	andi.w	#$00ff,d6
	subi.w	#96,d0
	subi.w	#16,d6
	movem.w	d0/d6,Bob_Special_6(a4)		;Set next random-position
.no_timeout:
	movem.w	Bob_Special_6(a4),d6-d7

	moveq	#-1,d4				;Set first dummy delta...
	move.l	Act_Bob_Structure,a0
.loop:
	movem.w	Bob_X_Position(a4),d2-d3
	tst.b	Bob_Used(a0)
	bmi.s	.next
;		move.b	O_COLEN(a0),d0		;Collision on player ?
;		and.b	O_PHITEN(a0),d0
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.next
	move.w	Bob_X_Position(a0),d0		;Calc |DX|+|DY| as target 'distance'
	sub.w	d2,d0
	bpl.s	.noneg
	neg.w	d0
.noneg:
	move.w	Bob_Y_Position(a0),d1
	sub.w	d3,d1
	bpl.s	.noneg2
	neg.w	d1
.noneg2:
	add.w	d1,d0
	cmp.w	d4,d0				;Lower than last choice ?
	bhs.s	.next
	move.w	Bob_X_Position(a0),d6		;Yes, remember position
	move.w	Bob_Y_Position(a0),d7
	move.w	d0,d4				;Remember 'distance'
.next:
	lea	BOB_ENTRY_LENGTH(a0),a0
	cmp.l	#Bob_Structure_End,a0
	bne	.loop

.no_object:
	moveq	#0,d6
	moveq	#0,d7
	bsr	calc_ene_angle			;Calc new angle

	moveq	#0,d0				;Get angle
	move.b	Bob_Special_3(a4),d0
	cmp.b	d0,d1				;Turning neccessary ?
	beq	.no_change

	move.b	d0,d2				;Which side is the shorter
	sub.b	d1,d2				;way ?
	sub.b	d0,d1
	cmp.b	d1,d2
	bls.s	.lower
	cmpi.b	#RSPEED,d1			;Difference big enough ?
	bls.s	.lab1
	addi.b	#RSPEED,Bob_Special_3(a4)	;Yes...
	bra.s	.ok
.lab1:
	add.b	d1,Bob_Special_3(a4)		;No, only add right diff.
	bra.s	.ok
.lower:
	cmpi.b	#RSPEED,d2			;Difference big enough ?
	bls.s	.lab2
	subi.b	#RSPEED,Bob_Special_3(a4)	;Yes...
	bra.s	.ok
.lab2:
	sub.b	d2,Bob_Special_3(a4)		;No...
.ok:

	move.b	Bob_Special_3(a4),d0		;Calc x,y - deltas
	bsr	sin
	move.w	d0,d2
	move.b	Bob_Special_3(a4),d0
	bsr	cos
	neg.w	d0
	asr.w	#4,d0
	asr.w	#4,d2
	movem.w	d0/d2,Bob_Special_1(a4)		;Store deltas

.no_change:
	movem.w	Bob_Special_1(a4),d0-d1		;Get deltas
	add.w	d0,Bob_Special_4(a4)		;Add to position
	add.w	d1,Bob_Special_5(a4)

	movem.w	Bob_X_Position(a4),d0-d1	;Check wall-collision
	bsr	check_obj_kollision
	bne	.end_rocket			;Rocket hit ground
	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl.s	.out
	subq.b	#1,T_rocket_anz
.out:
	rts


Rocket_AnimTable:
		dc.l	main_Buffer+Cbob18-Cbob18,main_Buffer+Cmsk18-Cbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Cbob19-Cbob18,main_Buffer+Cmsk19-Cbob18
		dc.w	0,0,14,2,2,12,11
		dc.l	main_Buffer+Cbob1a-Cbob18,main_Buffer+Cmsk1a-Cbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Cbob1b-Cbob18,main_Buffer+Cmsk1b-Cbob18
		dc.w	0,0,15,2,2,12,11

		dc.l	main2_GFX+Cbob1c,main2_GFX+Cmsk1c
		dc.w	0,0,15,2,2,12,11
		dc.l	main2_GFX+Cbob1b,main2_GFX+Cmsk1b
		dc.w	0,0,15,2,2,12,11
		dc.l	main2_GFX+Cbob1a,main2_GFX+Cmsk1a
		dc.w	0,0,13,2,2,12,11
		dc.l	main2_GFX+Cbob19,main2_GFX+Cmsk19
		dc.w	0,0,14,2,2,12,11

		dc.l	main2_GFX+Cbob18,main2_GFX+Cmsk18
		dc.w	0,0,13,2,2,12,11

		dc.l	main2_GFX+Cbob18+12*3*2,main2_GFX+Cmsk18+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main2_GFX+Cbob19+13*3*2,main2_GFX+Cmsk19+13*2
		dc.w	0,0,14,2,2,12,11
		dc.l	main2_GFX+Cbob1a+12*3*2,main2_GFX+Cmsk1a+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main2_GFX+Cbob1b+14*3*2,main2_GFX+Cmsk1b+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main2_GFX+Cbob1c+14*3*2,main2_GFX+Cmsk1c+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Cbob1b-Cbob18+14*3*2,main_Buffer+Cmsk1b-Cbob18+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Cbob1a-Cbob18+12*3*2,main_Buffer+Cmsk1a-Cbob18+12*2
		dc.w	0,0,13,2,2,12,11

calc_ene_angle:
	move.l	a6,-(sp)
	movem.w	Bob_X_Position(a4),d4-d5	;Rocket coordinates
	moveq	#0,d1				;Calc |DY|
	move.w	d7,d1
	sub.w	d5,d1
	bpl.s	.cok
	neg.w	d1
.cok:
	sub.l	a6,a6
	move.l	d1,a6				;Remember |DY| in a6
	move.w	d6,d0				;Calc DX
	sub.w	d4,d0
	muls	d0,d0				;DX*DX
	mulu	d1,d1				;|DY|*|DY|
	add.l	d1,d0				;DX^2+DY^2

	bsr	sqrt				;Pythagoras...

	move.l	a6,d1				;Get and adjust |DY|
	asl.l	#7,d1
	tst.w	d0
	bne.s	.div
	moveq	#1,d0
.div:
	divu	d0,d1				;SIN(X)   (|DY|/R)
	moveq	#0,d0				;Calculate ASIN
	lea	asin_tab(pc),a0
	move.b	(a0,d1.w),d0			;Angle	(ASIN(SIN(X)))
	cmp.w	d6,d4				;Adjust angle to full 256 "degrees"
	ble.s	.not_bigger
	cmp.w	d7,d5
	ble.s	.no1
	move.w	#256,d1
	sub.w	d0,d1
	bra.s	.set_angle
.no1:
	move.w	d0,d1
	bra	.set_angle
.not_bigger:
	cmp.w	d7,d5
	ble.s	.no2
	move.w	d0,d1
	addi.w	#128,d1
	bra.s	.set_angle
.no2:
	move.w	#128,d1
	sub.w	d0,d1
.set_angle:					;Save angle with float-part
	move.l	(sp)+,a6
	and.l	#255,d1				;Mask only lower 8 bits
	rts


*---------------------------------------------------------------------------
*	Routine and AnimTable of      Shoot
*---------------------------------------------------------------------------

Shoot_AnimTable:
		dc.l	main2_GFX+Cbob17,main2_GFX+Cmsk17
		dc.w	0,0,7,1,1,5,5
		dc.w	ENTRY_END
		dc.l	Shoot_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Bonus1-4
*---------------------------------------------------------------------------

BONUS_POWER	= 1
BONUS_WEAPON1	= 2
BONUS_WEAPON2	= 3
BONUS_WEAPON3	= 4
BONUS_SHIELD	= 5
BONUS_ROCKET	= 6
BONUS_ONEUP	= 7

Bonus1_AnimTable:
		dc.l	main2_GFX+Cbob16,main2_GFX+Cmsk16
		dc.w	0,0,12,BONUS_POWER,2,12,8
Bonus2_AnimTable:
		dc.l	main2_GFX+Cbob1f,main2_GFX+Cmsk1f
		dc.w	0,0,16,BONUS_WEAPON3,2,12,19
Bonus3_AnimTable:
		dc.l	main2_GFX+Cbob1d,main2_GFX+Cmsk1d
		dc.w	0,0,16,BONUS_WEAPON2,2,12,19
Bonus4_AnimTable:
		dc.l	main2_GFX+Cbob1e,main2_GFX+Cmsk1e
		dc.w	0,0,16,BONUS_WEAPON1,2,12,19
Bonus5_AnimTable:
		dc.l	main2_GFX+Cbob18,main2_GFX+Cmsk18
		dc.w	0,0,13,BONUS_ROCKET,2,12,11
Bonus6_AnimTable:
		dc.l	main2_GFX+Cbob23,main2_GFX+Cmsk23
		dc.w	0,0,16,BONUS_SHIELD,2,12,12
Bonus7_AnimTable:
		dc.l	main2_GFX+Cbob24,main2_GFX+Cmsk24
		dc.w	0,0,16,BONUS_ONEUP,2,12,12

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Extrabox
*---------------------------------------------------------------------------

Box_AnimTable:
		dc.l	main2_GFX+Cbob20,main2_GFX+Cmsk20
		dc.w	0,0,24,2,2,28,20
		dc.l	main2_GFX+Cbob22,main2_GFX+Cmsk22
		dc.w	0,10,14,2,2,28,20
		dc.w	ENTRY_END
		dc.l	Box_AnimTable

Deckel_AnimTable:
		dc.l	main2_GFX+Cbob21,main2_GFX+Cmsk21
		dc.w	0,0,19,2,2,28,20

*---------------------------------------------------------------------------
*	Routine and AnimTable of      BigExplo
*---------------------------------------------------------------------------

Explo_AnimTable:
		dc.l	main2_GFX+Cbob00,main2_GFX+Cmsk00
		dc.w	0,13,18,0,0,0,0
		dc.l	main2_GFX+Cbob01,main2_GFX+Cmsk01
		dc.w	0,5,27,0,0,0,0
		dc.l	main2_GFX+Cbob02,main2_GFX+Cmsk02
		dc.w	0,2,30,0,0,0,0
		dc.l	main2_GFX+Cbob03,main2_GFX+Cmsk03
		dc.w	0,0,32,0,0,0,0
		dc.l	main2_GFX+Cbob04,main2_GFX+Cmsk04
		dc.w	0,0,32,0,0,0,0
		dc.l	main2_GFX+Cbob05,main2_GFX+Cmsk05
		dc.w	0,0,32,0,0,0,0
		dc.l	main2_GFX+Cbob06,main2_GFX+Cmsk06
		dc.w	0,0,31,0,0,0,0
		dc.l	main2_GFX+Cbob07,main2_GFX+Cmsk07
		dc.w	0,0,27,0,0,0,0
		dc.l	main2_GFX+Cbob08,main2_GFX+Cmsk08
		dc.w	0,0,24,0,0,0,0
		dc.l	main2_GFX+Cbob09,main2_GFX+Cmsk09
		dc.w	0,0,16,0,0,0,0
		dc.w	END_OUT_DAMAGE

Explo2_AnimTable:
		dc.l	main2_GFX+Cbob0a,main2_GFX+Cmsk0a
		dc.w	0,0,14,0,0,0,0
		dc.l	main2_GFX+Cbob0b,main2_GFX+Cmsk0b
		dc.w	0,2,7,0,0,0,0
		dc.l	main2_GFX+Cbob0c,main2_GFX+Cmsk0c
		dc.w	0,1,12,0,0,0,0
		dc.l	main2_GFX+Cbob0d,main2_GFX+Cmsk0d
		dc.w	0,0,14,0,0,0,0
		dc.l	main2_GFX+Cbob0e,main2_GFX+Cmsk0e
		dc.w	0,0,14,0,0,0,0
		dc.l	main2_GFX+Cbob0f,main2_GFX+Cmsk0f
		dc.w	0,1,14,0,0,0,0
		dc.l	main2_GFX+Cbob10,main2_GFX+Cmsk10
		dc.w	0,2,13,0,0,0,0
		dc.l	main2_GFX+Cbob11,main2_GFX+Cmsk11
		dc.w	0,2,13,0,0,0,0
		dc.w	END_OUT_DAMAGE

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Walker
*---------------------------------------------------------------------------

Walker_Start:
	moveq	#-1,d0
	btst	#0,Bob_Special_4+1(a4)
	beq.s	.ok
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	moveq	#1,d0
.ok:
	move.w	d0,Bob_Special_5(a4)
	move.l	#Walker_Ground,Bob_Routine(a4)
	bra	Walker_Ground

Walker_Ground:
	moveq	#$50,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	move.w	d0,d2
	add.w	#32,d2
	addq.w	#1,d1
	jsr	check_foot_frame
	beq.s	.no_one_stands_on_me

	tst.b	T_state
	bpl.s	.no_one_stands_on_me			;Spieler springt nicht drauf!

	st	T_force_jump
	clr.b	T_state

	move.l	#Walker_maniac,Bob_Routine(a4)
	move.l	#Area_Enter_Vector,Bob_Entry_Adress(a4)	;Walker ist tot!
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#$00010001,Bob_Anim_Delay(a4)

	lea	Walker_MAnimTableR(pc),a0
	move.w	Bob_Special_5(a4),d0
	add.w	d0,d0
	add.w	d0,d0
	move.w	d0,Bob_Special_5(a4)
	bpl.s	.set
	lea	Walker_MAnimTableL(pc),a0
.set:
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out

.no_one_stands_on_me:
	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)

	tst.w	d0
	bmi.s	.left

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_r
	add.w	#12,d1
	subq.w	#8,d0

	jsr	check_obj_kollision
	bne	Standart_BobAnim

	;Should Walker fall ?

	btst	#1,Bob_Special_4+1(a4)
	bne.s	.change_r

	move.l	#Walker_Fall,Bob_Routine(a4)
	bra	Test_Bob_Out

.change_r:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableL,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_l
	add.w	#12,d1
	addq.w	#8,d0
	jsr	check_obj_kollision
	bne	Standart_BobAnim

	btst	#1,Bob_Special_4+1(a4)
	bne.s	.change_l

	move.l	#Walker_Fall,Bob_Routine(a4)
	bra	Test_Bob_Out

.change_l:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

Walker_maniac:
	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)
	tst.w	d0
	bmi.s	.left
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	jsr	check_obj_kollision
	beq	.check_fall
.destruct:
	add.w	#8,Bob_Y_Position(a4)
	bra	Standart_Destruction

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	jsr	check_obj_kollision
	bne	.destruct

.check_fall:
	movem.w	Bob_X_Position(a4),d0-d1
	add.w	#28,d1
	add.w	#16,d0
	jsr	check_obj_kollision
	bne	Standart_BobAnim

	addq.w	#4,Bob_Y_Position(a4)

	bra	Standart_BobAnim

Walker_Fall:
	moveq	#$50,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)

	addq.w	#3,Bob_Y_Position(a4)

	tst.w	d0
	bmi.s	.left

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_r
	add.w	#12,d1
	subq.w	#8,d0

	jsr	check_obj_kollision
	beq	Standart_BobAnim

	bra.s	.normal

.change_r:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableL,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_l
	add.w	#12,d1
	addq.w	#8,d0
	jsr	check_obj_kollision
	beq	Standart_BobAnim

	bra.s	.normal

.change_l:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

.normal:
	move.l	#Walker_Ground,Bob_Routine(a4)
	bra	Test_Bob_Out

Walker_AnimTableL:
		dc.l	level_GFX+bob02,level_GFX+msk02
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob03,level_GFX+msk03
		dc.w	0,1,27,2,2,28,24
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob05,level_GFX+msk05
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableL

Walker_MAnimTableL:
		dc.l	level_GFX+bob07,level_GFX+msk07
		dc.w	0,13,15,2,2,28,24
		dc.l	level_GFX+bob08,level_GFX+msk08
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableL

Walker_Flip	= level_Buffer-bob02

Walker_AnimTableR:
		dc.l	Walker_Flip+bob02,Walker_Flip+msk02
		dc.w	0,0,28,2,2,28,24
		dc.l	Walker_Flip+bob03,Walker_Flip+msk03
		dc.w	0,1,27,2,2,28,24
		dc.l	Walker_Flip+bob04,Walker_Flip+msk04
		dc.w	0,0,28,2,2,28,24
		dc.l	Walker_Flip+bob05,Walker_Flip+msk05
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableR

Walker_MFlip	= Walker_Flip+bob06-bob07

Walker_MAnimTableR:
		dc.l	Walker_MFlip+bob07,Walker_MFlip+msk07
		dc.w	0,13,15,2,2,28,24
		dc.l	Walker_MFlip+bob08,Walker_MFlip+msk08
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableR


;--------------------------------------------------------------------------
Next_Level:
	clr.w	Cue_Point
	addq.w	#1,act_level
	move.w	act_level,d0
	cmp.w	#1,d0
	beq	Init_Level_1
	cmp.w	#2,d0
	beq	Init_Level_2
	st	Cue_Point
	rts

act_level:	dc.w	Level


Init_Datas:
	clr.w	Drop_count
	rts

Init_World:
	sf	Plane_flag

	move.l	Act_Scr_Structure,a6
	move.l	#character,Scr_Character(a6)

	move.l	#Blit_Rope8,Rope_Vector

	lea	Sound,a0
	move.l	(a0)+,d1
	add.l	a0,d1
	move.l	a0,d0
	jsr	TFMX+52

	lea	Main_Clist,a0
	move.l	a0,cop1lch(a5)

	jsr	init_parallax
	jsr	set_copcolors

	moveq	#14,d7
	lea	Score+3648+2,a0
	lea	Col_lab1,a1
.setcol2:
	move.w	(a0)+,2(a1)
	addq.l	#4,a1
	dbf	d7,.setcol2

	lea	level_flipI(pc),a3
	lea	level_GFX,a0
	lea	level_Buffer,a1
	jsr	Flip_Bobs

	lea	main2_flipI(pc),a3
	lea	main2_GFX,a0
	lea	main_Buffer,a1
	jsr	Flip_Bobs

	;a0 = Pointer auf Quell-Daten (Normales interleaved Bob)
	;a1 = Pointer auf Chunky-Mode-Buffer
	;a2 = Pointer auf Leere Rotate-Info Struktur, die mit Daten gefllt wird.
	;a3 = Pointer auf Quell-Maske (Einfache Masken-Plane)
	;d0 = Seitenlnge des Objekts (In Pixeln).
	;d1 = Planetiefe des Objekts

	lea	level_GFX+bob0b,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk0b,a3
	moveq	#32,d0
	moveq	#3,d1
	jsr	Convert_to_Rotate

	move.l	#Rotate2,Dest_Obj
	clr.w	Angle_Obj

.rotate_it:
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	move.w	Angle_Obj,d0
	jsr	Do_Rotate

	move.l	Dest_Obj,a0
	lea	3*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	moveq	#32,d7
	jsr	Convert_to_Bitplane3

	add.l	#512,Dest_Obj
	addq.b	#8,Angle_Obj+1
	bne	.rotate_it

	move.l	Act_Scr_Structure,a6
	move.w	#96,Scr_Blt_Len(a6)
	move.w	#64*16*3+1,Scr_Blt_Blit_Size(a6)
	move.l	#(208+48)*planeb*3,Scr_X_Supply_Sub(a6)
	move.l	#16*planeb*3,Scr_X_Supply_Add(a6)
	move.w	#planeb*3,Scr_Plane_Width(a6)

	lea	Smart_Info,a1
	move.w	#3,Bob_I_Depth(a1)
	move.w	#1*2*3,Bob_I_B_Modulo(a1)
	move.w	#planeb*3,Bob_I_D_Modulo(a1)

	lea	Smart_Structure,a1
	move.l	#main2_GFX+Cbob25,Bob_Graphics(a1)
	move.l	#main2_GFX+Cmsk25,Bob_Mask(a1)

	move.l	#Para_field,d0
	move.w	#para_b-16,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.l	#-1,bltafwm(a5)
	move.w	#$09f0,bltcon0(a5)

	moveq	#1,d7
.blitloop:
	move.l	d0,bltdpth(a5)
	move.l	#para_bg,bltapth(a5)

	move.w	#64*128*3+8,bltsize(a5)

	waitblt
	add.l	#32,d0
	dbf	d7,.blitloop

	lea	Para_field,a0
	lea	flip_table,a2
	lea	32(a0),a1
	moveq	#0,d0

	move.w	#128*3,d7
.yloop:
	moveq	#15,d6
.line:
	move.b	(a0)+,d0
	move.b	(a2,d0.w),d0
	move.b	d0,-(a1)
	dbf	d6,.line
	lea	para_b-16(a0),a0
	lea	para_b+16(a1),a1
	dbf	d7,.yloop

	move.l	#Para_field+16,bltapth(a5)
	move.w	#para_b-16,bltamod(a5)
	move.l	#Para_field+48,bltdpth(a5)
	move.w	#64*128*3+8,bltsize(a5)
	waitblt

	move.w	#para_b-8,bltamod(a5)
	move.w	#para_b-8,bltdmod(a5)
	move.l	#Para_field,bltapth(a5)
	move.l	#Para_field+64,bltdpth(a5)
	move.w	#64*128*3+4,bltsize(a5)
	waitblt

	rts

Init_Level_1:
	SONGPLAY #0

	move.l	#Col_lab2,Color_Pointer
	move.l	#Handle_Player,Player_Vector
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.w	#levelb1,Scr_Level_Width(a6)
	move.l	#Level1-1-levelb1,Scr_Level_Pointer(a6)
	move.l	#Level1,Scr_Level(a6)
	move.w	#levelb1*16-320+31,Scr_X_Max(a6)
	move.w	#levelh1*16-208+32,Scr_Y_Max(a6)
	move.l	#Area1,Area_Vector
	move.w	#33,Scr_BA_Anz_Area_X(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Cue_Table1,Act_Cue_Table
	move.l	#Return,SFX_Handler
	rts

Init_Level_2:
	move.l	#Col_lab2,Color_Pointer
	move.l	#Handle_Player,Player_Vector
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.w	#levelb2,Scr_Level_Width(a6)
	move.l	#Level2-1-levelb2,Scr_Level_Pointer(a6)
	move.l	#Level2,Scr_Level(a6)
	move.w	#levelb2*16-320+32-2,Scr_X_Max(a6)
	move.w	#levelh2*16-208,Scr_Y_Max(a6)
	move.l	#Area2+8,Area_Vector
	move.w	#33,Scr_BA_Anz_Area_X(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Cue_Table2,Act_Cue_Table
	move.l	#Return,SFX_Handler
	rts


Level1_Clist:
	move.l	Act_Scr_Structure,a6
	move.l	Scr_Supply_Field(a6),d0
	move.l	Scr_Show_Field(a6),Scr_Supply_Field(a6)
	move.l	d0,Scr_Show_Field(a6)
	not.w	Scr_Screen_num(a6)

	move.l	#Main_Clist,cop1lch(a5)

SetClist:
	lea	Coplab4(pc),a0
	move.w	Scr_X_Level_Pos(a6),d0
	and.w	#15,d0
	moveq	#15,d1
	sub.w	d0,d1
	move.w	d1,d0
	move.w	Scr_X_Level_Pos(a6),d0
	lsr.w	#1,d0
	and.w	#15,d0
	neg.w	d0
	add.w	#15,d0
	lsl.w	#4,d0
	or.w	d0,d1
	move.w	d1,2(a0)

	lea	Coplab1(pc),a0
	moveq	#0,d1
	move	Scr_Y_Play_Anf(a6),d0
	mulu	Scr_Plane_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	add.l	d1,d0
	add.l	Scr_Show_Field(a6),d0

	swap	d0
	move	d0,2(a0)
	swap	d0
	move	d0,6(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,10(a0)
	swap	d0
	move	d0,14(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,18(a0)
	swap	d0
	move	d0,22(a0)

	lea	Coplab2(pc),a0
	move.w	Clist_oldcolpos1,d1
	bmi.s	.no1
	move.w	#COPCOL,4(a0,d1.w)	;Farbding wieder reinschreiben.
.no1:
	move.w	Clist_oldcolpos2,d1
	bmi.s	.no2
	move.w	#COPCOL,4(a0,d1.w)	;Farbding wieder reinschreiben.
.no2:
	move.w	Clist_oldcolpos3,d1
	bmi.s	.no3
	move.w	#COPCOL,4(a0,d1.w)	;Farbding wieder reinschreiben.
.no3:
	tst.b	Col_Init_Flag
	beq.s	.no_init1
	bsr	init_parallax
.no_init1:

	move.w	Scr_Plane_Height(a6),d0
	sub.w	Scr_Y_Play_Anf(a6),d0
	add.w	#$30,d0
	move.w	#-1,Clist_oldcolpos1
	cmp.w	#$ff,d0
	bhs.s	.no_copjump
	sub.w	#$30,d0
	asl.w	#3,d0

	move.w	d0,Clist_oldcolpos1
	move.w	6(a0,d0.w),d1		;Diese Farbe wurde geschrieben.

.no_copjump:
	lea	Coplab3(pc),a0
;	move.w	d0,22(a0)		;LO-Word
;	swap	d0
;	move.w	d0,18(a0)		;HI-Word
	move.w	d1,14(a0)		;Farbwert
.dont_update:
	lea	Coplab3(pc),a0		;Bplpt fr Wrap
	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	lsr.w	#3,d0
	add.l	Scr_Show_Field(a6),d0

	move.w	d0,2(a0)
	add.l	#planeb,d0
	move.w	d0,6(a0)
	add.l	#planeb,d0
	move.w	d0,10(a0)

	lea	Sprlab(pc),a0
	bsr	Set_Sprites

	tst.b	Col_Flag
	beq.s	.no_col
	lea	$dff1b0,a1
	lea	Col_Buffer(pc),a0
	tst.b	Col_Init_Flag
	beq.s	.no_init2
	lea	Col_Buffer2(pc),a0
.no_init2:
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	sf	Col_Flag
.no_col:

	lea	Coplab5(pc),a0
	moveq	#0,d6
	move.w	Scr_X_Level_Pos(a6),d6
	lsr.w	#1,d6
	and.w	#255,d6
	lsr.w	#3,d6
	and.w	#$fffe,d6
	add.l	#Para_field,d6


	moveq	#0,d0
	move.w	para_ypos,d0
	divu	#127,d0
	and.w	#1,d0
	move.w	d0,Para_Flag
	swap	d0
	move.w	d0,Para_Ypos
.no_over:
	move.w	Para_Ypos,d0		;0-127
	move.w	d0,d7

	tst.w	Para_Flag
	beq.s	.positiv

	neg.w	d0
	add.w	#126,d0

	move.w	#-para_b*3-40,14(a0)
	move.w	#para_b*3-40,Copgosub1+2
	move.w	#-para_b*3-40,Copgosub2+2
	bra.s	.set
.positiv:
	move.w	#para_b*3-40,14(a0)
	move.w	#-para_b*3-40,Copgosub1+2
	move.w	#para_b*3-40,Copgosub2+2
.set:
	mulu	#para_b*3,d0
	add.l	d6,d0
	move.w	d0,2(a0)
	add.w	#para_b,d0
	move.w	d0,6(a0)
	add.w	#para_b,d0
	move.w	d0,10(a0)

	move.w	d7,d0
	neg.w	d0
	add.w	#127,d0

	tst.w	Para_Flag
	beq.s	.ok
	subq.w	#1,d0
	bpl.s	.ok
	sub.w	#126,Para_Ypos
	eor.w	#1,Para_Flag
	bra	.no_over
.ok:
	move.w	d0,d1
	asl.w	#3,d1

	move.w	d1,Clist_oldcolpos2

	move.w	#-1,Clist_oldcolpos3
	add.w	#127,d0
	cmp.w	#$ff-$30,d0
	bge.s	.no_jump2
	asl.w	#3,d0
	move.w	d0,Clist_oldcolpos3
.no_jump2:
	
	move.w	Clist_oldcolpos1,d0
	lea	Coplab3(pc),a0
	move.w	Clist_oldcolpos2,d1
	lea	Copgosub1(pc),a1
	move.w	Clist_oldcolpos3,d2
	lea	Copgosub2(pc),a2

.again:
	moveq	#0,d7
	cmp.w	d1,d0
	bls.s	.sort_ok1
	move.w	d0,d6
	move.w	d1,d0
	move.w	d6,d1
	move.l	a0,d6
	move.l	a1,a0
	move.l	d6,a1
	moveq	#1,d7
.sort_ok1:
	cmp.w	d2,d1
	bls.s	.sort_ok2
	move.w	d1,d6
	move.w	d2,d1
	move.w	d6,d2
	move.l	a1,d6
	move.l	a2,a1
	move.l	d6,a2
	moveq	#1,d7
.sort_ok2:
	tst.w	d7
	bne.s	.again

	move.l	a4,-(sp)
	lea	Coplab2(pc),a4
	tst.w	d0
	bmi.s	.no_set1
	move.w	a0,Coplab6+2			;Hierhin verzweigen.
	move.w	6(a4,d0.w),14(a0)
	move.w	#$008a,4(a4,d0.w)		;Jump auslsen!
	lea	8(a4,d0.w),a3
	move.w	a3,18(a0)			;Rcksprung.
.no_set1:
	tst.w	d1
	bmi.s	.no_set2
	cmp.w	d0,d1
	bne.s	.set2
	;d0 und d0 sind gleich.
	move.w	a1,18(a0)
	bra.s	.goon2
.set2:
	move.w	a1,22(a0)			;Weitersprung.
	move.w	6(a4,d1.w),14(a1)
	move.w	#$008a,4(a4,d1.w)
.goon2:
	lea	8(a4,d1.w),a3
	move.w	a3,18(a1)			;Rcksprung.
.no_set2:
	tst.w	d2
	bmi.s	.no_set3
	cmp.w	d1,d2
	bne.s	.set3
	;d0 und d0 sind gleich.
	move.w	a2,18(a1)
	bra.s	.goon3
.set3:
	move.w	a2,22(a1)			;Weitersprung.
	move.w	6(a4,d2.w),14(a2)
	move.w	#$008a,4(a4,d2.w)
.goon3:
	lea	8(a4,d2.w),a3
	move.w	a3,18(a2)			;Rcksprung.
.no_set3:

	move.l	(sp)+,a4
	rts


Set_Sprites:
	lea	sprite_adr,a1
	lea	sprite_pos,a2
	moveq	#7,d7
.set_spr:
	move.l	(a1)+,d0
	move.l	d0,a3
	move.l	(a2)+,(a3)		;Position setzen.
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	lea	8(a0),a0
	dbf	d7,.set_spr
	rts

Col_Buffer:	dc.l	0,0,0
Col_Buffer2:	dc.l	0,0,0
Col_Flag:	dc.b	0
Col_Init_Flag:	dc.b	0

Para_Ypos:	dc.w	0
Para_Flag:	dc.w	0

Clist_oldcolpos1:	dc.w	-1
Clist_oldcolpos2:	dc.w	-1
Clist_oldcolpos3:	dc.w	-1

	;d0 nicht benutzen
init_parallax:

	move.l	#-1,bltafwm(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)
	move.w	#6,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.l	#parallax,d3
	move.l	#Coplab2+6,bltdpth(a5)
	move.l	d3,bltapth(a5)
	move.w	#64*$d0+1,bltsize(a5)
.bwait0:
	btst	#14,dmaconr(a5)
	bne	.bwait0
	rts

para_ypos:	dc.l	0

Fade_Colors:
	lea	SetClist(pc),a4
	move.l	Act_Scr_Structure,a6
	st	Col_Init_Flag
	tst.w	d0
	bmi.s	.fade_out
.fade_in:
	bsr	Wait_tof

	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors

	addq.w	#1,Fade_Position
	bsr	Fade_to_Dest

	cmp.w	#16,Fade_Position
	bne	.fade_in
	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors
	sf	Col_Init_Flag
	rts


.fade_out:
	bsr	Wait_tof

	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors

	subq.w	#1,Fade_Position
	bsr	Fade_to_Dest

	tst.w	Fade_Position
	bne	.fade_out
	sf	Col_Init_Flag
	rts

Wait_tof:
	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$12000,d0
	bne.s	Wait_tof
	rts


Fade_to_Dest:
	move.w	Fade_Position(pc),d7
	lea	B_parallax,a0		;Source
	lea	parallax,a1		;Destination
	move.w	#207,d6
	bsr	Do_Fade_colors
	lea	B_coltab,a0		;Source
	lea	coltab,a1		;Destination
	move.w	#31,d6
	bsr	Do_Fade_colors
	lea	Col_Buffer,a0		;Source
	lea	Col_Buffer2,a1		;Destination
	move.w	#5,d6
	bsr	Do_Fade_colors
	lea	C_coltab,a0		;Source
	lea	C_buffer,a1		;Destination
	move.w	#13,d6
	bsr	Do_Fade_colors
	rts


Do_Fade_colors:
	move.b	(a0)+,d1
	and.w	#15,d1
	mulu	d7,d1
	lsr.w	#4,d1
	move.b	d1,(a1)+
	moveq	#0,d0
	move.b	(a0)+,d0
	move.b	d0,d1
	and.w	#15,d1
	mulu	d7,d1
	lsr.w	#4,d1
	lsr.b	#4,d0
	mulu	d7,d0
	and.b	#$f0,d0
	or.b	d0,d1
	move.b	d1,(a1)+
	dbf	d6,Do_Fade_colors
	rts

set_weapon_colors:
	lea	$dff1a2,a1
	move.w	Col_Buffer2+8,d0
	move.w	d0,8(a1)
	move.w	d0,(a1)+
	move.w	Col_Buffer2+10,d0
	move.w	d0,8(a1)
	move.w	d0,(a1)
	rts

Fade_Position:	dc.w	0
Color_Pointer:	dc.l	Col_lab2

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
levelb1	=	132
levelh1	=	132
levelb2	=	132
levelh2	=	132

;--------------------------------------------------------------------------
Bob_Plates_Pointer

planeb	=	40+4
planeh	=	208+4*16+20

	Even
coltab:
	dcb.w	32,0

B_coltab:
	dc.w	$0080,$0CBB,$0369,$0987,$0654,$0584,$0322,$0FFF
	dc.w	$0000,$04A7,$0020,$0031,$0152,$0263,$0385,$0ADD

	dc.w	$000,$8c1,$080,$fff,$442,$8c1,$080,$fff
	dc.w	$8ae,$26a,$e00,$820,$ea2,$aaa,$666,$000

C_coltab:
	dc.w	$06A6,$0232,$0464,$0430,$04B9,$0690
	dc.w	$0060,$0760,$0894,$09D0,$0720,$0467,$0460,$09F9

C_buffer:	ds.w	15

	Even
Main_Clist:
Col_lab2:
	dc.w	$0182,$0000
	dc.w	$0184,$0000
	dc.w	$0186,$0000
	dc.w	$0188,$0000
	dc.w	$018a,$0000
	dc.w	$018c,$0000
	dc.w	$018e,$0000
	dc.w	$0190,$0000
	dc.w	$0192,$0000
	dc.w	$0194,$0000
	dc.w	$0196,$0000
	dc.w	$0198,$0000
	dc.w	$019a,$0000
	dc.w	$019c,$0000
	dc.w	$019e,$0000

Sprlab:
	dc.w	$0120,$0000
	dc.w	$0122,$0000
	dc.w	$0124,$0000
	dc.w	$0126,$0000
	dc.w	$0128,$0000
	dc.w	$012a,$0000
	dc.w	$012c,$0000
	dc.w	$012e,$0000
	dc.w	$0130,$0000
	dc.w	$0132,$0000
	dc.w	$0134,$0000
	dc.w	$0136,$0000
	dc.w	$0138,$0000
	dc.w	$013a,$0000
	dc.w	$013c,$0000
	dc.w	$013e,$0000

	dc.w	$008e,$3091
	dc.w	$0090,$18c1
	dc.w	$0092,$0038
	dc.w	$0094,$00d0
	dc.w	$0108,planeb*3-40
	dc.w	$0100,$6400
	dc.w	$0104,4+4*8
Coplab4:
	dc.w	$0102,$0000

Coplab1:
	dc.w	$00e0,$0004
	dc.w	$00e2,0
	dc.w	$00e8,$0004
	dc.w	$00ea,0+planeb
	dc.w	$00f0,$0004
	dc.w	$00f2,0+planeb*2
Coplab5:
	dc.w	$00e6,(Para_field+para_b*0+127*para_b*3)&$ffff
	dc.w	$00ee,(Para_field+para_b*1+127*para_b*3)&$ffff
	dc.w	$00f6,(Para_field+para_b*2+127*para_b*3)&$ffff
	dc.w	$010a,-para_b*3-40
	dc.w	$00e4,Para_field/$10000
	dc.w	$00ec,Para_field/$10000
	dc.w	$00f4,Para_field/$10000

Coplab6:
	dc.w	$0086,Coplab3&$ffff
	dc.w	$0084,Coplab3/$10000

Coplab2:
line	SET	$30

	REPT	$d0
	dc.b	line,$07
	dc.w	$fffe,COPCOL,0

line	SET	line+1

	ENDR

Copjumpin:
	dc.w	$fedf,$fffe
	dc.w	$0100,$0000

	dc.w	$0082,Main_Clist&$ffff

	dc.w	$ffdf,$fffe

	dc.w	$0092,$0040
	dc.w	$00e0,Score/$10000
	dc.w	$00e2,Score&$ffff
	dc.w	$00e4,(Score+912)/$10000
	dc.w	$00e6,(Score+912)&$ffff
	dc.w	$00e8,(Score+912*2)/$10000
	dc.w	$00ea,(Score+912*2)&$ffff
	dc.w	$00ec,(Score+912*3)/$10000
	dc.w	$00ee,(Score+912*3)&$ffff
	dc.w	$0102,$0000
	dc.w	$0108,$0000
	dc.w	$010a,$0000

	dc.w	$0192,$008

	dc.w	$0007,$fffe
	dc.w	$0100,$4000

Col_lab1:
	dc.w	$0182,$0000
	dc.w	$0184,$0000
	dc.w	$0186,$0000
	dc.w	$0188,$0000
	dc.w	$018a,$0000
	dc.w	$018c,$0000
	dc.w	$018e,$0000
	dc.w	$0190,$0000
	dc.w	$0192,$0000
	dc.w	$0194,$0000
	dc.w	$0196,$0000
	dc.w	$0198,$0000
	dc.w	$019a,$0000
	dc.w	$019c,$0000
	dc.w	$019e,$0000

	dc.w	$0140,$0000
	dc.w	$0148,$0000
	dc.w	$0150,$0000
	dc.w	$0158,$0000
	dc.w	$0160,$0000
	dc.w	$0168,$0000
	dc.w	$0170,$0000
	dc.w	$0178,$0000

	dc.w	$0101,$fffe,$0192,$0006

	dc.w	$0a01,$fffe,$0182,$e00
	dc.w	$0184,$e82,$0186,$ec0
	dc.w	$0188,$0c1,$018a,$080

	dc.w	$0b01,$fffe,$0190,$e82
	dc.w	$0d01,$fffe,$0190,$ec0

	dc.w	$0182,$a00,$0184,$a50
	dc.w	$0186,$a80,$0188,$080
	dc.w	$018a,$060
	dc.w	$0f01,$fffe,$0190,$fff
	dc.w	$1001,$fffe,$0190,$ec0
	dc.w	$0182,$888
	dc.w	$1101,$fffe,$0182,$aaa
	dc.w	$1201,$fffe,$0190,$e82
	dc.w	$0182,$ccc
	dc.w	$1301,$fffe,$0182,$aaa
	dc.w	$1401,$fffe,$0190,$e00
	dc.w	$0182,$888
	dc.w	$1701,$fffe,$0192,$0004

	dc.w	$ffff,$fffe

Coplab3:
	dc.w	$00e2,0
	dc.w	$00ea,0
	dc.w	$00f2,0+planeb*2
	dc.w	COPCOL,$0000

	dc.w	$0082,$0000
	dc.w	$0086,$0000
;	dc.w	$0180,$0040
	dc.w	$0088,$0001

Copgosub1:
	dc.w	$010a,-para_b*3-40
	dc.w	$0180,0
	dc.w	$0180,0
	dc.w	COPCOL,$0000
	dc.w	$0082,$0000
	dc.w	$0086,$0000
;	dc.w	$0180,$0004
	dc.w	$0088,$0001

Copgosub2:
	dc.w	$010a,-para_b*3-40
	dc.w	$0180,0
	dc.w	$0180,0
	dc.w	COPCOL,$0000
	dc.w	$0082,$0000
	dc.w	$0086,$0000
;	dc.w	$0180,$0400
	dc.w	$0088,$0001

B_parallax:	incbin	work:sources/t3/bitplanes/w4_copper1.col
B_parallax3:	dc.w	$0a75,$0532,$0044,$0411,$0200,$0010,$0743
D_parallax:	incbin	work:sources/t3/bitplanes/w2_copper2.col

paracoltab:	ds.w	14

B_paracoltab:	dc.w	$0aac,$088a,$0666,$066a,$0468,$0446,$0224,$0444
		dc.w	$0876,$0420,$0544,$0a60,$0840,$0620

Area1:		include	W4_level2_area
Area2:		include	W4_level1_area
