	IFND	custom
	END
	ENDC

;
;			    Level Daten
;

bob00 	= $00000
msk00 	= $00080
bob01 	= $000a0
msk01 	= $00290
bob02 	= $0030c
msk02 	= $004cc
bob03 	= $0053c
msk03 	= $006ec
bob04 	= $00758
msk04 	= $00918
bob05 	= $00988
msk05 	= $00b38
bob06 	= $00ba4
msk06 	= $00be4

bob07 	= $00d84
msk07 	= $00f84
bob08 	= $01004
msk08 	= $011c4
bob09 	= $01234
msk09 	= $013f4
bob0a 	= $01464
msk0a 	= $01614
bob0b 	= $01680
msk0b 	= $016e8
bob0c 	= $01702
msk0c 	= $01762
bob0d 	= $0177a
msk0d 	= $017ea
bob0e 	= $01806
msk0e 	= $0181e
bob0f 	= $01824
msk0f 	= $01844
bob10 	= $0184c
msk10 	= $0187c
bob11 	= $01888
msk11 	= $018d0
bob12 	= $018e2
msk12 	= $01912
bob13 	= $0191e
msk13 	= $01976
bob14 	= $0198c
msk14 	= $01b0c
bob15 	= $01b6c
msk15 	= $01cec
bob16 	= $01d4c
msk16 	= $01ecc
bob17 	= $01f2c
msk17 	= $0216c
bob18 	= $021fc
msk18 	= $0243c
bob19 	= $024cc
msk19 	= $0261c
bob1a 	= $02670
msk1a 	= $02850
bob1b 	= $028c8
msk1b 	= $02ab8
bob1c 	= $02b34
msk1c 	= $02c74
bob1d 	= $02cc4
msk1d 	= $02e24
bob1e 	= $02e7c
msk1e 	= $02ecc
bob1f 	= $02ee0
msk1f 	= $02f60
bob20 	= $02f80
msk20 	= $03140
bob21 	= $031b0
msk21 	= $03370
bob22 	= $033e0
msk22 	= $035e0
bob23 	= $03660
msk23 	= $03860
bob24 	= $038e0
msk24 	= $03ae0

Abob00 	= $00000
Abob01 	= $00180
Abob02 	= $00300

		;AdressOffset,Anzahl Zeilen gesamt (Bob+maske),Breite pro Zeile
level_flipI:	dc.w	bob02,28*5,32/8
		dc.w	bob03,27*5,32/8
		dc.w	bob04,28*5,32/8
		dc.w	bob05,27*5,32/8

		dc.w	-1

Cue_Table1:	dc.w	100,145
		dc.w	1920,97
		dc.w	4230,129
		dc.w	4780,113
		dc.w	6150,81
		dc.w	8750,97


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	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	Ball_Info_1	;11 Ball
		dc.l	Walker_Info_1	;12 Walker
		dc.l	Birne_Info_1	;13 Birne
		dc.l	Birne_Info_2	;14 Birnenkette

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	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;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	$ffffffff	;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	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;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	$ffffffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	Move_Bonus_Jump	;Routine, die Bob verwaltet
		dc.l	Bonus1_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;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.

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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$ffffffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	-1*2		;A Modulo
		dc.w	-1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	$fffeffff	;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	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	Start_Ball	;Routine, die Bob verwaltet
		dc.l	Ball_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;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.

Walker_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	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;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	4		;Hitpoints
		dc.l	Walker_Start	;Routine, die Bob verwaltet
		dc.l	Walker_AnimTableL	;Zeiger auf nchste Anim

		dc.w	0		;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.

Birne_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	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;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	4		;Hitpoints
		dc.l	Start_Birne	;Routine, die Bob verwaltet
		dc.l	Birne_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;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.

Birne_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	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;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	Move_Bonus_Jump	;Routine, die Bob verwaltet
		dc.l	Birne_AnimTable2;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;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     Birne
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Broot	rs.l	1
Banz	rs.w	1
Bangle	rs.w	1
Bspeed	rs.w	1
Badder	rs.w	1

MAX	equ 2<<8
ADD	equ 1<<4

Start_Birne:
	move.w	#(180>>4)-1,Banz(a4)
	subi.w	#180,Bob_Y_Position(a4)		;Set new position

	clr.w	Bangle(a4)		;Init swing-variables
	move.w	#-MAX,d0
	btst	#0,Bob_Special_4+1(a4)			;Start swing-direction
	beq.s	.to_left
	neg.w	d0
.to_left:
	move.w	d0,Bspeed(a4)
	move.w	#ADD,Badder(a4)

	move.l	a4,-(sp)

	move.w	Banz(a4),d7
.init:
	movem.l	a4/d7,-(sp)
	moveq	#14,d0
	tst.w	d7
	bne.s	.ok
	moveq	#13,d0
.ok:
	moveq	#0,d1
	moveq	#0,d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	a4,a0
	movem.l	(sp)+,a4/d7
		move.l	#handle_chain,Bob_Routine(a0)
		tst.w	d7

		sf	Bangle(a0)
		sf	Banz(a0)
		move.l	a0,Broot(a4)
		move.l	a0,a4
	dbf	d7,.init

	move.l	(sp)+,a4

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

Birne:
	move.w	Bspeed(a4),d1

	move.w	Badder(a4),d0			;Do swinging
	add.w	d0,Bspeed(a4)

;	tst.w	d1				;Play sound, if direction changes
;	.if (minus) {
;		tst.w	speed(a5)
;		bmi.s	.no_fx
;		PLAY_FX	#57
;	} .else {
;		tst.w	speed(a5)
;		bpl.s	.no_fx
;		PLAY_FX	#57
;	}
.no_fx:

	cmpi.w	#MAX,Bspeed(a4)			;Handle swinging
	ble.s	.no1
	move.w	#-ADD,Badder(a4)
.no1:
	cmpi.w	#-MAX,Bspeed(a4)
	bge.s	.no2
	move.w	#ADD,Badder(a4)
.no2:
	move.w	Bangle(a4),d1
	move.w	Bspeed(a4),d0
	add.w	d0,Bangle(a4)

	moveq	#0,d4				;Handle bending etc.
	movem.w	Bob_X_Position(a4),d5-d6
	move.w	Banz(a4),d7
	move.l	Broot(a4),a5

.set_positions:
		move.b	Bangle(a5),d0
		subi.b	#64,d0
		bsr	sin
		muls	d4,d0
		asr.l	#8,d0
		move.w	d6,d1
		sub.w	d0,d1
		move.w	d1,Bob_Y_Position(a5)
		move.b	Bangle(a5),d0
		subi.b	#64,d0
		bsr	cos
		muls	d4,d0
		asr.l	#8,d0
		add.w	d5,d0
		move.w	d0,Bob_X_Position(a5)
			add.w	#16,d4
		cmpi.w	#1,d7
		bne.s	.lno1
			addi.w	#12,d4
.lno1:
		tst.w	d7
		beq.s	.lno2
			move.l	Broot(a5),a0
			move.b	Bangle(a0),Bangle(a5)
			move.l	a0,a5
.lno2:

	dbf	d7,.set_positions

	move.b	Bangle(a4),Bangle(a5)
	lea	custom,a5
	movem.w	Bob_X_Position(a4),d0-d1		;Out of screen ?
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	addi.w	#100,d0
	addi.w	#256,d1
	cmpi.w	#320+200,d0
	bhs.s	.free_obj1
	cmpi.w	#224+232,d1
	bhs.s	.free_obj1
	rts
.free_obj1:
;	move.l	a5,a0				;Set free-flag in all slaves
;	move.w	anz(a5),d0
;	.do {
;		move.l	root(a5),a5
;		st	anz(a5)
;	} .loop d0
	bra	Out_Bob

handle_chain:
	tst.b	Banz(a4)			;Just wait to be freed !
	beq.s	.out
	bra	Out_Bob_Damage
.out:
	rts

Birne_AnimTable:
		dc.l	level_GFX+bob01,level_GFX+msk01
		dc.w	-12,-12,31,2,2,12,11
Birne_AnimTable2:
		dc.l	level_GFX+bob06,level_GFX+msk06
		dc.w	4,4,8,2,2,12,11

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Ball
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Ldir	rs.w	1
Lspeed	rs.l	1
Lylow	rs.w	1

Start_Ball:
	moveq	#-1,d0
	btst	#0,Bob_Special_4+1(a4)
	beq.s	.ok
	neg.w	d0
.ok:
	move.w	d0,Ldir(a4)
	clr.l	Lspeed(a4)
	clr.w	Lylow(a4)
	moveq	#2,d0
	tst.b	T_weapon
	beq.s	.set
	moveq	#4,d0
.set:
	move.w	d0,Bob_Power(a4)
	move.l	#Ball,Bob_Routine(a4)

Ball:
	moveq	#$60,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	cmpi.w	#8,Lspeed(a4)
	bge.s	.no_speedup
		addi.l	#$00004000,Lspeed(a4)
.no_speedup:
	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#8,d1
	tst.w	Ldir(a4)
	bpl.s	.right
	subq.w	#8,d0
	bra.s	.left
.right:
	addi.w	#16,d0
.left:
	bsr	check_obj_kollision
	beq.s	.no_xhit
;		PLAY_FX	#51
	neg.w	Ldir(a4)
.no_xhit:
	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#8,d0
	tst.w	Lspeed(a4)
	bmi.s	.up
	addi.w	#16,d1
	bra.s	.down
.up:
	subq.w	#8,d1
.down:
	bsr	check_obj_kollision
	beq.s	.no_yhit
	neg.l	Lspeed(a4)
.no_yhit:

	move.w	Ldir(a4),d0
	add.w	d0,Bob_X_Position(a4)
	move.w	Lspeed+2(a4),d0
	add.w	d0,Lylow(a4)
	move.w	Lspeed(a4),d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

	bra	Test_Bob_Out

Ball_AnimTable:
		dc.l	level_GFX+bob00,level_GFX+msk00
		dc.w	0,0,16,2,2,12,11

Zoom_Controler:
	tst.w	Zoom_finished
	bne.s	.out
	st	Zoom_finished
	move.l	Zoom_info_pointer,a1
	move.l	(a1),a1
	addq.l	#4,Zoom_info_pointer
	jmp	(a1)
.out:
	rts

Kill_Controler:
	move.l	#Return,-4(a0)
	rts

Zoom_info_pointer:	dc.l	0

Zoom_Handler:
	move.l	Zoom_Routine(pc),a1
	jmp	(a1)

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

Zoom_Rot_1:
	move.l	#Zoom_Rot_2,Zoom_Routine
	move.l	Zoom_pointer,a0
	move.l	(a0),d0
	lea	Work_Buffer1-6,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Do_Zoom
	rts

Zoom_Rot_2:
	move.l	#Zoom_Rot_3,Zoom_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

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

	rts

Zoom_Rot_3:
	move.l	#Zoom_Rot_1,Zoom_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
	addq.l	#4,Zoom_pointer
	move.l	Zoom_pointer,a0
	tst.l	(a0)
	bpl.s	.out
	move.l	#Zoom_Kill,Zoom_Routine
.out:
	rts

Zoom_Routine:	dc.l	Zoom_Rot_1
Zoom_pointer:	dc.l	0
Zoom_finished:	dc.w	0

spider_zoom_pos:
	dc.l	$80000,$70000,$60000,$50000,$48000,$40000,$38000,$30000,$28000
	dc.l	$20000,$1c000,$18000,$15000,$13000,$12000,$10000,-1


*---------------------------------------------------------------------------
*	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	main_GFX+Mbob29,main_GFX+Mmsk29
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2a,main_GFX+Mmsk2a
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2b,main_GFX+Mmsk2b
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2a,main_GFX+Mmsk2a
		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	main_GFX+Mbob26,main_GFX+Mmsk26
		dc.w	0,16,16,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		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

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

Rotate_Kill:
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
	move.w	#$f00,$dff180
	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	#16,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.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
	bra.s	.setit
.set_noflip:
	lea	Rocket_Info_1(pc),a0
	sub.l	a4,a0
.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:
	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:
	bsr	.calc_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

.calc_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:
	move.w	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.w	d1,d0				;DX^2+DY^2
	bsr	sqrt				;Pythagoras...
	move.l	a6,d1				;Get and adjust |DY|
	asl.w	#7,d1
	tst.w	d0
	beq.s	.nodiv
	divu	d0,d1				;SIN(X)   (|DY|/R)
.nodiv:
	moveq	#0,d0				;Calculate ASIN
	lea	asin_tab(pc),a0
	move.b	0(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
	andi.w	#255,d1				;Mask only lower 8 bits
	rts

Rocket_AnimTable:
		dc.l	main_Buffer+Mbob18-Mbob18,main_Buffer+Mmsk18-Mbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Mbob19-Mbob18,main_Buffer+Mmsk19-Mbob18
		dc.w	0,0,14,2,2,12,11
		dc.l	main_Buffer+Mbob1a-Mbob18,main_Buffer+Mmsk1a-Mbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Mbob1b-Mbob18,main_Buffer+Mmsk1b-Mbob18
		dc.w	0,0,15,2,2,12,11

		dc.l	main_GFX+Mbob1c,main_GFX+Mmsk1c
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1b,main_GFX+Mmsk1b
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1a,main_GFX+Mmsk1a
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob19,main_GFX+Mmsk19
		dc.w	0,0,14,2,2,12,11

		dc.l	main_GFX+Mbob18,main_GFX+Mmsk18
		dc.w	0,0,13,2,2,12,11

		dc.l	main_GFX+Mbob18+12*4*2,main_GFX+Mmsk18+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob19+13*4*2,main_GFX+Mmsk19+13*2
		dc.w	0,0,14,2,2,12,11
		dc.l	main_GFX+Mbob1a+12*4*2,main_GFX+Mmsk1a+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob1b+14*4*2,main_GFX+Mmsk1b+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1c+14*4*2,main_GFX+Mmsk1c+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Mbob1b-Mbob18+14*4*2,main_Buffer+Mmsk1b-Mbob18+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Mbob1a-Mbob18+12*4*2,main_Buffer+Mmsk1a-Mbob18+12*2
		dc.w	0,0,13,2,2,12,11

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Shoot
*---------------------------------------------------------------------------
Start_Shoot:
	move.l	a4,-(sp)
	movem.l	d2-d3,-(sp)
	move.w	d1,d2
	move.w	d0,d1
	lea	Area_Enter_Vector(pc),a1
	moveq	#7,d0
	bsr	Search_Bob_Entry
	movem.l	(sp)+,d2-d3
	tst.w	d7
	bmi.s	.no
	move.w	d2,Bob_Special_1(a4)
	move.w	d3,Bob_Special_2(a4)
.no:
	move.l	(sp)+,a4
	rts

Shoot_Start:
	move.l	#Shoot,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
Shoot:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	addq.w	#3,d0
	addq.w	#3,d1

	move.w	T_posX,d2
	add.w	Scr_X_Level_Pos(a6),d2
	add.w	#10,d2
	cmp.w	d0,d2
	bgt.s	.no_hit
	add.w	#18,d2
	cmp.w	d0,d2
	blt.s	.no_hit

	move.w	T_posY,d3
	add.w	Scr_Y_Level_Pos(a6),d3
	addq.w	#4,d3
	cmp.w	d1,d3
	bgt.s	.no_hit
	add.w	#24,d3
	cmp.w	d1,d3
	blt.s	.no_hit

	sub.w	#9,d2
	sub.w	d0,d2
	bmi.s	.ok
	moveq	#0,d2
.ok:
	move.b	d2,T_hitdir

	bsr	make_plhit
	bra	Out_Bob_Damage

.no_hit:
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.destruct	

	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Special_3(a4)
	move.w	Bob_Special_3(a4),d0
	asr.w	#6,d0
	add.w	d0,Bob_X_Position(a4)
	move.w	Bob_Special_3(a4),d0
	and.w	#$ffc0,d0
	sub.w	d0,Bob_Special_3(a4)

	move.w	Bob_Special_2(a4),d0
	add.w	d0,Bob_Special_4(a4)
	move.w	Bob_Special_4(a4),d0
	asr.w	#6,d0
	add.w	d0,Bob_Y_Position(a4)

	move.w	Bob_Special_4(a4),d0
	and.w	#$ffc0,d0
	sub.w	d0,Bob_Special_4(a4)

	bra	Standart_BobAnim

.destruct:
	move.l	a4,-(sp)

	move.w	d1,d2
	move.w	d0,d1
	subq.w	#8,d1
	subq.w	#8,d2
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)

	move.l	(sp)+,a4
	bra	Out_Bob_Damage	

Shoot_AnimTable:
		dc.l	main_GFX+Mbob17,main_GFX+Mmsk17
		dc.w	0,0,7,1,1,5,5
		dc.w	ENTRY_END
		dc.l	Shoot_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Bonus1-4
*---------------------------------------------------------------------------
Move_Bonus_Jump:
	movem.w	Bob_X_Position(a4),d6-d7
	move.w	d6,d0
	move.w	d7,d1

	tst.w	Bob_Special_1(a4)
	bpl.s	.add
	subq.w	#8,d0
	bra.s	.sub
.add:
	addq.w	#8,d0
.sub:
	bsr	check_obj_kollision		;Way blocked ?
	bne.s	.no_xmove
	add.w	Bob_Special_1(a4),d6		;X - Movement
	cmpi.w	#304,d6
	bhi.s	.no_xmove
	sub.w	Bob_Special_1(a4),d6
.no_xmove:
	move.w	Bob_Special_2(a4),d2		;Get jump-index
	cmpi.w	#24*2,d2			;Maximum reached ?
	blt.s	.not_ready
.ready:
	move.l	#Move_Bonus,Bob_Routine(a4)	;Just let extra flow up
	bra.s	.exit_jmp
.not_ready:

	lea	.ExtBounce(pc),a0		;Jump-table
	move.w	d6,d0
	move.w	d7,d1
	move.w	0(a0,d2.w),d5
	bpl.s	.add2
	sub.w	#8,d1
	bra.s	.sub2
.add2:
	addq.w	#8,d1
.sub2:
	bsr	check_obj_kollision		;Way blocked ?
	bne.s	.ready
	add.w	d5,d7				;Y - Movement
.no_ymove:
	addq.w	#2,Bob_Special_2(a4)		;Increase index
.exit_jmp:
	movem.w	d6-d7,Bob_X_Position(a4)
	bra	Bonus_Check_Collect

.ExtBounce:
	dc.w	-6,-6,-5,-5,-4,-4,-3,-3,-2,-2,-1,-1,0,0
	dc.w	1,1,1,1,2,2,3,3,4,4,5


Move_Bonus:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	addq.w	#8,d0

	bsr	check_obj_kollision
	bne.s	.no_move

	move.w	eights_pixel(pc),d0
	sub.w	d0,Bob_Y_Position(a4)
.no_move:

	subq.w	#1,Bob_Special_4(a4)
	bpl	.wait

	btst	#1,Bob_Special_4+1(a4)
	beq.s	.clear
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
	bra.s	.set
.clear:
	bclr	#NO_BOBBLIT,Bob_BlitStatus(a4)
.set:
	cmp.w	#-50,Bob_Special_4(a4)
	bgt.s	.wait

	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2

	move.w	Bob_to_Info_Offs(a4),d3
	cmp.w	#2,Bob_I_Mask_Width(a4,d3.w)
	beq.s	.start
	addq.w	#4,d1
	addq.w	#2,d2

.start:
	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	(sp)+,a4
	bra	Out_Bob_Damage
.wait:
Bonus_Check_Collect:
	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

	move.w	14(a0),d0
	cmp.w	#BONUS_POWER,d0
	beq.s	.power
	cmp.w	#BONUS_WEAPON1,d0
	beq.s	.weapon1
	cmp.w	#BONUS_WEAPON2,d0
	beq.s	.weapon2
	cmp.w	#BONUS_WEAPON3,d0
	beq.s	.weapon3
	cmp.w	#BONUS_SHIELD,d0
	beq.s	.shield
	cmp.w	#BONUS_ROCKET,d0
	beq.s	.rocket
	bra	Out_Bob_Damage
.rocket:
	st	T_rocket
	bra	Out_Bob_Damage
.shield:
	st	T_shield
	bra	Out_Bob_Damage
.weapon1:
	moveq	#0,d0
.do_weapon:
	cmp.b	T_weapon_new,d0
	beq.s	.powup
	move.b	d0,T_weapon_new
	bra	Out_Bob_Damage
.powup:
	cmp.b	#2,T_power_new
	beq	Out_Bob_Damage
	addq.b	#1,T_power_new
	bra	Out_Bob_Damage
.weapon2:
	moveq	#1,d0
	bra.s	.do_weapon
.weapon3:
	moveq	#2,d0
	bra.s	.do_weapon

.power:
	move.b	#64,T_energy
	bra	Out_Bob_Damage

.no_collect:
	bra	Test_Bob_Out

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	main_GFX+Mbob16,main_GFX+Mmsk16
		dc.w	0,0,12,BONUS_POWER,2,12,8
Bonus2_AnimTable:
		dc.l	main_GFX+Mbob1f,main_GFX+Mmsk1f
		dc.w	0,0,16,BONUS_WEAPON3,2,12,19
Bonus3_AnimTable:
		dc.l	main_GFX+Mbob1e,main_GFX+Mmsk1e
		dc.w	0,0,16,BONUS_WEAPON2,2,12,19
Bonus4_AnimTable:
		dc.l	main_GFX+Mbob1d,main_GFX+Mmsk1d
		dc.w	0,0,16,BONUS_WEAPON1,2,12,19
Bonus5_AnimTable:
		dc.l	main_GFX+Mbob18,main_GFX+Mmsk18
		dc.w	0,0,13,BONUS_ROCKET,2,12,11
Bonus6_AnimTable:
		dc.l	main_GFX+Mbob23,main_GFX+Mmsk23
		dc.w	0,0,16,BONUS_SHIELD,2,12,12
Bonus7_AnimTable:
		dc.l	main_GFX+Mbob24,main_GFX+Mmsk24
		dc.w	0,0,16,BONUS_ONEUP,2,12,12

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Extrabox
*---------------------------------------------------------------------------
Extrabox:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	move.w	d0,d2
	add.w	#32,d2
	bsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	bsr	alias_feet
.no_feet:
	tst.w	Bob_Hit(a4)
	beq	Test_Bob_Out
	bsr	Get_Next_Bob_Frame
	move.l	#Area_Enter_Vector,Bob_Entry_Adress(a4)
	move.l	#Test_Bob_Out,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)

	move.l	a4,-(sp)
	moveq	#4,d0
	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#-$00060000,Bob_Special_1(a4)
	move.l	a4,a0
	move.l	(sp)+,a4

	move.w	#2,Bob_Special_3(a0)

	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	T_posX,d0
	bpl.s	.ok
	move.w	#-2,Bob_Special_3(a0)
.ok:

	;Inhalt der Box starten.

	move.w	Bob_X_Position(a4),d5
	move.w	Bob_Y_Position(a4),d6
	addi.w	#12,d5
	subi.w	#24,d6
	lea	extra_xtab(pc),a2
	jsr	rnd
	and.w	#$0060,d0
	lea	(a2,d0.w),a2
	moveq	#6,d4
.loop:
	btst	d4,Bob_Special_4+1(a4)
	beq.s	.no_start
	move.w	d4,d0
	move.w	d5,d1
	move.w	d6,d2
	bsr	.init_extra
.no_start:
	dbf	d4,.loop

	bra	Test_Bob_Out

.init_extra:
	move.l	a4,-(sp)

	lea	Area_Enter_Vector(pc),a1
	movem.l	a2/d0,-(sp)
	moveq	#5,d0
	bsr	Search_Bob_Entry
	movem.l	(sp)+,a2/d0
	mulu	#22,d0
	add.l	#Bonus1_AnimTable,d0
	move.l	d0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.w	#450,Bob_Special_4(a4)

	move.w	(a2)+,Bob_Special_1(a4)		;X - Dir

	move.w	(a2)+,Bob_Special_2(a4)

	move.l	(sp)+,a4
	rts

extra_xtab:	dc.w	0,0,2,8,-1,2,1,10,-2,0,0,8,2,2
		dc.l	0

		dc.w	-1,2,-2,0,0,8,2,8,0,0,2,2,1,10
		dc.l	0

		dc.w	2,8,1,10,2,2,0,8,-1,2,0,0,-2,0
		dc.l	0

		dc.w	0,8,-1,2,2,2,1,10,2,8,-2,0,0,0
		dc.l	0

Box_Deckel:
	move.w	Bob_Special_3(a4),d0
	add.w	d0,Bob_X_Position(a4)
	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Y_Position(a4)
	add.l	#$00008000,Bob_Special_1(a4)

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

	bsr	check_obj_kollision
	beq	Test_Bob_Out
	moveq	#0,d0
	bra	Standart_Destruction

Box_AnimTable:
		dc.l	main_GFX+Mbob20,main_GFX+Mmsk20
		dc.w	0,0,24,2,2,28,20
;		dc.l	$78000,$79000
;		dc.w	0,0,32,2,2,28,20
		dc.l	main_GFX+Mbob22,main_GFX+Mmsk22
		dc.w	0,10,14,2,2,28,20
		dc.w	ENTRY_END
		dc.l	Box_AnimTable

Deckel_AnimTable:
		dc.l	main_GFX+Mbob21,main_GFX+Mmsk21
		dc.w	0,0,19,2,2,28,20

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

Explo_AnimTable:
		dc.l	main_GFX+Mbob00,main_GFX+Mmsk00
		dc.w	0,13,18,0,0,0,0
		dc.l	main_GFX+Mbob01,main_GFX+Mmsk01
		dc.w	0,5,27,0,0,0,0
		dc.l	main_GFX+Mbob02,main_GFX+Mmsk02
		dc.w	0,2,30,0,0,0,0
		dc.l	main_GFX+Mbob03,main_GFX+Mmsk03
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob04,main_GFX+Mmsk04
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob05,main_GFX+Mmsk05
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob06,main_GFX+Mmsk06
		dc.w	0,0,31,0,0,0,0
		dc.l	main_GFX+Mbob07,main_GFX+Mmsk07
		dc.w	0,0,27,0,0,0,0
		dc.l	main_GFX+Mbob08,main_GFX+Mmsk08
		dc.w	0,0,24,0,0,0,0
		dc.l	main_GFX+Mbob09,main_GFX+Mmsk09
		dc.w	0,0,16,0,0,0,0
		dc.w	END_OUT_DAMAGE

Explo2_AnimTable:
		dc.l	main_GFX+Mbob0a,main_GFX+Mmsk0a
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0b,main_GFX+Mmsk0b
		dc.w	0,2,7,0,0,0,0
		dc.l	main_GFX+Mbob0c,main_GFX+Mmsk0c
		dc.w	0,1,12,0,0,0,0
		dc.l	main_GFX+Mbob0d,main_GFX+Mmsk0d
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0e,main_GFX+Mmsk0e
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0f,main_GFX+Mmsk0f
		dc.w	0,1,14,0,0,0,0
		dc.l	main_GFX+Mbob10,main_GFX+Mmsk10
		dc.w	0,2,13,0,0,0,0
		dc.l	main_GFX+Mbob11,main_GFX+Mmsk11
		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_MAnimTableR:
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,13,15,2,2,28,24
		dc.l	level_GFX+bob05,level_GFX+msk05
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableR

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_MAnimTableL:
		dc.l	level_Buffer+bob04,level_Buffer+msk04
		dc.w	0,13,15,2,2,28,24
		dc.l	level_Buffer+bob05,level_Buffer+msk05
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableL


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

act_level:	dc.w	Level

Init_World:
	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	main_flipI(pc),a3
	lea	main_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+bob13,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk13,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	move.l	#Rotate_Buffer,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	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Convert_to_Bitplane

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

	rts

Init_Level_1:
	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*2,Scr_Level_Width(a6)
	move.l	#Level3-2-levelb1*2,Scr_Level_Pointer(a6)
	move.l	#Level3,Scr_Level(a6)
	move.w	#levelb1*16-320+16,Scr_X_Max(a6)
	move.w	#levelh1*16-208,Scr_Y_Max(a6)
	move.l	#Area1+8,Area_Vector
	move.w	#85,Scr_BA_Anz_Area_X(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Cue_Table1,Act_Cue_Table

	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*2,Scr_Level_Width(a6)
	move.l	#Level2-2-levelb2*2,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	#25,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

Init_Parafield:
	move.l	#$ffffffff,bltafwm(a5)
	move.w	#40-2,bltdmod(a5)
	move.w	#0,bltamod(a5)
	sub.w	#20,d5
.yloop:
	moveq	#20-1,d6
.xloop:
	moveq	#0,d0
	move.b	(a1)+,d0
	bmi.s	.space
	asl.w	#5,d0
	move.w	d0,d1
	add.w	d0,d0
	add.w	d1,d0
	add.l	a2,d0
	move.l	d0,bltapth(a5)
	move.l	a0,bltdpth(a5)
	move.w	#$09f0,bltcon0(a5)
.back:
	move.w	#64*16*3+1,bltsize(a5)
	waitblt
	addq.l	#2,a0
	dbf	d6,.xloop
	add.l	d5,a1
	add.l	#40*3*16-40,a0
	dbf	d7,.yloop

	rts
.space:
	move.l	a0,bltdpth(a5)
	move.w	#$0100,bltcon0(a5)
	bra.s	.back

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)

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
	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)
	add.l	#planeb,d0
	swap	d0
	move	d0,26(a0)
	swap	d0
	move	d0,30(a0)

	lea	Coplab2(pc),a0
	move.w	Clist_oldcolpos,d1
	move.w	#COPCOL,4(a0,d1.w)	;Farbding wieder reinschreiben.

	tst.b	Col_Init_Flag
	beq.s	.no_init1
	bsr	init_parallax
.no_init1:

	bsr	blit_parallax

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

	move.w	d0,Clist_oldcolpos
	move.w	#$008a,4(a0,d0.w)	;Jump auslsen.
	move.w	6(a0,d0.w),d1		;Diese Farbe wurde geschrieben.

	lea	8(a0,d0.w),a0		;Zu dieser Adresse returned der Copper.
	move.l	a0,d0

.no_copjump:

	lea	Coplab3(pc),a0
	move.w	d0,26(a0)		;LO-Word
	swap	d0
	move.w	d0,22(a0)		;HI-Word
	move.w	d1,18(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)
	add.l	#planeb,d0
	move.w	d0,14(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:
	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


Clist_oldcolpos:	dc.w	0
Clist_oldcolpos2:	dc.w	0

	;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

blit_parallax:
	rts

para_ypos:	dc.l	0
para_old:	dc.w	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	=	340
levelh1	=	44
levelb2	=	100
levelh2	=	102
levelb3	=	80
levelh3	=	71

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

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

	Even
coltab:
	dcb.w	32,0

B_coltab:
	dc.w	$0000,$0AAA,$0333,$0666,$0ECA,$0630,$06BF,$02A0
	dc.w	$0061,$0E80,$0E96,$0FD0,$0C20,$0960,$025C,$0FFF

	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*4-40
	dc.w	$010a,planeb*4-40
	dc.w	$0100,$4000
	dc.w	$0104,4+4*8
Coplab4:
	dc.w	$0102,$0000

Coplab1:
	dc.w	$00e0,$0004
	dc.w	$00e2,0
	dc.w	$00e4,$0004
	dc.w	$00e6,0+planeb
	dc.w	$00e8,$0004
	dc.w	$00ea,0+planeb*2
	dc.w	$00ec,$0004
	dc.w	$00ee,0+planeb*3

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

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	$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	$00e6,0
	dc.w	$00ea,0+planeb*2
	dc.w	$00ee,0+planeb*3
	dc.w	COPCOL,$0000

	dc.w	$0084,$0000
	dc.w	$0086,$0000
	dc.w	$008a,$0001


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

para_field:	incbin	work:modmaps/t3_para1.mod

elevator_field:
		dc.b	-1,-1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,-1,-1
		dc.b	-1,-1,-1,5,4,4,4,4,5,4,4,5,4,4,4,4,5,-1,-1,-1
		dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

Area1:		include	W3_level1_area
E14	= 2
E15	= 2
E16	= 2
E17	= 2
E18	= 2
E19	= 2

Area2:		include	W2_level2_area
