****************************************************************************
****************************************************************************
**                                                               
**  Platinum (Level Definitions)
**
**  This software is in the public domain.  There is no warranty.
**
**  by Patrick Davidson (pad@calc.org, http://pad.calc.org/)
**
**  Last updated August 2, 2001
**
****************************************************************************
****************************************************************************

********************************************* LEVEL TABLE
*
* This is the table of levels used to decode level number bytes, as is
* described in 'LEVELS.ASM'.  The LEVEL macro adds one entry to the table
* (as a word offset from the start of the table), sets a symbol of the level
* name to the current level number, then increments the number.
*
********

Level_Table:
        LEVEL   Level_1_Standard
        LEVEL   Level_2_Standard
        LEVEL   Level_3_Boss
        LEVEL   Platinum_Shop

        LEVEL   Level_4_Standard
        LEVEL   Level_5_Standard
        LEVEL   Level_Twirl_1
        LEVEL   Level_6_Boss
        LEVEL   Triangles
        LEVEL   Platinum_Shop

        LEVEL   Level_4a_Standard
        LEVEL   Level_5a_Standard
        LEVEL   Level_Twirl_2
        LEVEL   Level_6a_Boss
        LEVEL   Triangles
        LEVEL   Platinum_Shop

        LEVEL   Level_7_Standard
        LEVEL   Level_8_Standard
        LEVEL   Level_9_Boss
        LEVEL   Triangles
        LEVEL   Platinum_Shop

        LEVEL   Level_10_Standard
        LEVEL   Level_11_Standard
        LEVEL   Level_12_2Boss
        LEVEL   Platinum_Shop

        LEVEL   Level_13_Standard
        LEVEL   Level_14_Standard
        LEVEL   Level_15_3Boss
        LEVEL   Platinum_Shop

        LEVEL   Level_17_Standard
        LEVEL   Level_18_Standard
        LEVEL   Level_19_Boss
        LEVEL   Platinum_Shop

        LEVEL   Level_20_Standard
        LEVEL   Level_21_Standard
        LEVEL   Level_22_3Boss
        LEVEL   Platinum_Shop

        LEVEL   Level_Swoop
        LEVEL   Level_25_SuperBoss_Hard
        LEVEL   Platinum_Shop

        LEVEL   Wheel_Loop_5
        LEVEL   Wheel_Loop_8
        LEVEL   Wheel_Loop_10
        LEVEL   Wheel_Loop_16
        LEVEL   MWheel_Loop_20
        LEVEL   Platinum_Shop

        LEVEL   Level_33_RandX
        LEVEL   Level_34_RandX
        LEVEL   Level_35_RandX
        LEVEL   Platinum_Shop

        LEVEL   Level_26_Operators,LVL_O        
        LEVEL   Level_27_Operators_3Boss,LVL_O3 
        LEVEL   Level_28_Operators_5Boss,LVL_O5
        LEVEL   Platinum_Shop

        LEVEL   Level_Swoop
        LEVEL   MegaBoss

        LEVEL   Game_Finished

******************************************** LEVEL LOADERS
*
* These are the actual level loaders called to initialize each level.  The
* loaders for fake levels (the shop, etc.) are contained in their specific
* files.  For the levels specified by data, use the following macros:
*
* "LVL n" at the start of a level with n entries
* "LVLDB n,db" at the start of a level with n entries, using data bank db
*       for coordinate data
*
* "LENTRY n,type" to insert n enemies of type type
*
* "LWHEEL n,sep" wheel level, n wheels, separated by sep pixels
*
* "LMWHEEEL n,sep" as above, but with wheels in larger route
*
********

Level_Twirl_1:
        lea     Enemy_10(pc),a0
        moveq   #15,d0
        bsr     Load_Enemy_Info
        move.w  #Figure_1_Start-C_FIGURE,d1
        moveq   #14,d0
        moveq   #-5,d2
        moveq   #65,d3
        moveq   #1,d4
        moveq   #19,d5
        bra     Prepare_Figure_Enemies
        
Level_Twirl_2:
        lea     Enemy_10(pc),a0
        moveq   #15,d0
        bsr     Load_Enemy_Info
        move.w  #Figure_2_Start-C_FIGURE,d1
        moveq   #14,d0
        moveq   #-5,d2
        moveq   #65,d3
        moveq   #1,d4
        moveq   #19,d5
        bra     Prepare_Figure_Enemies

Level_1_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_1(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        moveq   #14,d4
        bra     Prepare_U_Entry

Level_2_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_1(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        moveq   #14,d4
        bra     Prepare_U_Entry

Level_3_Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_1(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss1(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #9,d0
        moveq   #14,d4
        bra     Prepare_U_Entry

Level_4_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_1b(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        lea     Enemy_2(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Simple_Entry

Level_5_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_2(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Simple_Entry

Level_6_Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_2(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss1(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #9,d0
        bra     Prepare_Simple_Entry

Level_4a_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_1(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        lea     Enemy_9(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        moveq   #12,d4
        bra     Prepare_U_Entry

Level_5a_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_9(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        moveq   #12,d4
        bra     Prepare_U_Entry

Level_6a_Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_9(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss1(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #9,d0
        moveq   #12,d4
        bra     Prepare_U_Entry

Level_7_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_5(pc),a0  
        moveq   #15,d0  
        bsr     Load_Enemy_Info
        moveq   #14,d0
        moveq   #0,d3
        bra     Prepare_Plain_Entry

Level_8_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_5(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        moveq   #-5,d3
        bra     Prepare_Plain_Entry

Level_9_Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_5(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss1(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #9,d0
        moveq   #-5,d3
        bra     Prepare_Plain_Entry

Level_10_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_3(pc),a0  
        moveq   #15,d0  
        bsr     Load_Enemy_Info
        moveq   #14,d0
        bra     Prepare_Spin_Entry

Level_11_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_3(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Spin_Entry

Level_12_2Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_3(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss1(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        lea     E_Boss2(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #9,d0
        bra     Prepare_Spin_Entry

Level_13_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_3(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        lea     Enemy_4(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Spin_Entry

Level_14_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_4(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Spin_Entry

Level_15_3Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_4(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info
        lea     E_Boss2(pc),a0  
        moveq   #3,d0   
        bsr     Load_Enemy_Info 
        move.w  #-210,-e_size+e_data(a1)        
        move.w  #-270,-(2*e_size)+e_data(a1)    
        moveq   #9,d0
        bra     Prepare_Spin_Entry

Level_20_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_3(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info
        lea     Enemy_7(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info 
        moveq   #19,d0
        bra     Prepare_Spin_Entry

Level_21_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_7(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info 
        moveq   #19,d0
        bra     Prepare_Spin_Entry

Level_22_3Boss:
        lea     low_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_7(pc),a0
        moveq   #10,d0
        bsr     Load_Enemy_Info 
        lea     E_Boss2(pc),a0  
        moveq   #3,d0   
        bsr     Load_Enemy_Info 
        move.w  #-210,-e_size+e_data(a1)        
        move.w  #-270,-(2*e_size)+e_data(a1)    
        moveq   #9,d0
        bra     Prepare_Spin_Entry

Level_17_Standard:
        lea     standard_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_6(pc),a0
        moveq   #20,d0
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Simple_Entry

Level_18_Standard:
        lea     swing_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_6(pc),a0
        moveq   #20,d0
        bsr     Load_Enemy_Info
        moveq   #19,d0
        bra     Prepare_Simple_Entry

Level_19_Boss:
        lea     multi_data_bank(pc),a4
        bsr     Install_Data_Bank
        lea     Enemy_6(pc),a0
        moveq   #24,d0
        bsr     Load_Enemy_Info
        lea     E_Boss3(pc),a0
        moveq   #1,d0
        bsr     Load_Enemy_Info
        moveq   #23,d0
        bra     Prepare_Simple_Entry

Level_21_3Boss:
        lea     low_data_bank(pc),a4        
        bsr     Install_Data_Bank
        lea     Enemy_7(pc),a0  
        moveq   #10,d0  
        move.w  #EDestruct_Solid-Destroy_Base,d6        
        bsr     Load_Enemy_Info 
        move.w  #EDestruct_Normal-Destroy_Base,d6       
        lea     E_Boss2(pc),a0  
        moveq   #3,d0   
        bsr     Load_Enemy_Info 
        move.w  #-210,-e_size+e_data(a1)        
        move.w  #-270,-(2*e_size)+e_data(a1)    
        rts     

Level_25_SuperBoss_Hard:
        lea     low_data_bank(pc),a4        
        bsr     Install_Data_Bank
        lea     Enemy_9(pc),a0  
        moveq   #10,d0  
        bsr     Load_Enemy_Info 
Level_25_SuperBoss:
        move.w  #EDestruct_Boss-Destroy_Base,d6 
        lea     E_fake(pc),a0   
        moveq   #1,d0   
        bsr     Load_Enemy_Info 
        lea     E_SupL(pc),a0   
        moveq   #1,d0   
        bsr     Load_Enemy_Info 
        lea     E_SupR(pc),a0   
        moveq   #1,d0   
        bsr     Load_Enemy_Info 
        subq.w  #1,enemies_remaining(a5)        
        moveq   #9,d0
        moveq   #12,d4
        bra     Prepare_U_Entry

Level_26_Operators:
        move.b  #64,smct+1      
        lea     Enemy_0(pc),a0  
        moveq   #12,d0  
        bra     Load_Enemy_Info 

Level_27_Operators_3Boss:
        lea     Enemy_0(pc),a0  
        moveq   #12,d0  
        bsr     Load_Enemy_Info 
        lea     E_Boss2(pc),a0  
        moveq   #3,d0   
        bsr     Load_Enemy_Info 
        move.w  #-180,-e_size+e_data(a1)        
        move.w  #-120,-(2*e_size)+e_data(a1)    
        rts     

Level_28_Operators_5Boss:
        lea     Enemy_0(pc),a0  
        moveq   #20,d0  
        bsr     Load_Enemy_Info 
        lea     E_Boss2(pc),a0  
        moveq   #5,d0   
        bsr     Load_Enemy_Info 
        move.w  #-210,-e_size+e_data(a1)        
        move.w  #-240,-(2*e_size)+e_data(a1)    
        move.w  #-180,-(3*e_size)+e_data(a1)    
        move.w  #-120,-(4*e_size)+e_data(a1)    
        rts     

Level_29_SuperBoss:
        lea     E_fake(pc),a0   
        moveq   #1,d0   
        bsr     Load_Enemy_Info 
        lea     E_SupL(pc),a0   
        moveq   #1,d0   
        bsr     Load_Enemy_Info 
        lea     E_SupR(pc),a0   
L29_Common:
        moveq   #1,d0   
        move.w  #EDestruct_Boss-Destroy_Base,d6 
        bsr     Load_Enemy_Info 
        subq.w  #1,enemies_remaining(a5)        
        lea     Enemy_0(pc),a0  
        moveq   #22,d0  
        bra     Load_Enemy_Info 

Level_33_RandX:
        move.b  #98,smct+1      
        lea     E_X(pc),a0      
        moveq   #12,d0  
        bra     Load_Enemy_Info 

Level_34_RandX:
        lea     E_X(pc),a0      
        moveq   #12,d0  
        bsr     Load_Enemy_Info 
        lea     E_Boss2(pc),a0  
        moveq   #3,d0   
        bsr     Load_Enemy_Info 
        move.w  #-180,-e_size+e_data(a1)        
        move.w  #-120,-(2*e_size)+e_data(a1)    
        rts     

Level_35_RandX:
        lea     E_X(pc),a0      
        moveq   #20,d0  
        bsr     Load_Enemy_Info 
        lea     E_Boss2(pc),a0  
        moveq   #5,d0   
        bsr     Load_Enemy_Info 
        move.w  #-210,-e_size+e_data(a1)        
        move.w  #-240,-(2*e_size)+e_data(a1)    
        move.w  #-180,-(3*e_size)+e_data(a1)    
        move.w  #-120,-(4*e_size)+e_data(a1)    
        rts     

MWheel_Loop_20:
        moveq   #20,d1
        moveq   #18,d2
        move.w  #MWHEEL_WAIT,d4
        bra.s   Wheel_Loader_Init

Wheel_Loop_16:
        moveq   #16,d1
        moveq   #10,d2
        bra.s   Wheel_Loader_Select

Wheel_Loop_10:
        moveq   #10,d1
        moveq   #16,d2
        bra.s   Wheel_Loader_Select

Wheel_Loop_8:
        moveq   #8,d1
        moveq   #20,d2
        bra.s   Wheel_Loader_Select

Wheel_Loop_5:
        moveq   #5,d1                   ; D1 = number of wheels
        moveq   #32,d2                  ; D2 = space between wheels

Wheel_Loader_Select:
        move.w  #WHEEL_WAIT,d4
Wheel_Loader_Init:
        move.w  d1,enemies_remaining(a5)        
        subq.w  #1,d1
        moveq   #1,d0
        moveq   #40,d3
        moveq   #-128,d5

Wheel_Loader:
        move.w  d4,(a1)+                ; Initial type
        move.w  d3,(a1)+                ; Enemy strength
        move.w  d5,(a1)+                ; Dummy X-coord
        move.w  #15,(a1)+               ; Width
        move.w  d5,(A1)+                ; Dummy X-coord
        move.w  #15,(A1)+               ; Height
        move.w  #in_Wheel_1,(a1)+       ; Image
        move.w  d0,(a1)+                ; Time counter
        move.w  d6,(a1)+        
        add.w   d2,d0                   ; Increment staggering level
        addq.w  #6,a1
        dbra    d1,Wheel_Loader
        rts     

MegaBoss:
        lea     E_MBC(pc),a0    
        moveq   #1,d0   
        move.w  #EDestruct_MBC-Destroy_Base,d6  
        bsr     Load_Enemy_Info 
        lea     E_MBL(pc),a0    
        moveq   #1,d0   
        move.w  #EDestruct_MBL-Destroy_Base,d6  
        bsr     Load_Enemy_Info 
        lea     E_MBR(pc),a0    
        moveq   #1,d0   
        move.w  #EDestruct_MBR-Destroy_Base,d6  
        bra     Load_Enemy_Info 

Level_Swoop:
        moveq   #15,d0
        lea     E_Swoop(pc),a0
        bra     Load_Enemy_Info 

Triangles:
        move.w  level_number(a5),d0     
        lea     E_Tri(pc),a0    
        bra     Load_Enemy_Info

******************************************** COORDINATE DATA BANKS

standard_data_bank:
        dc.w    70,20,90,20,110,20,130,20,150,20        
        dc.w    70,35,90,35,110,35,130,35,150,35        
        dc.w    70,50,90,50,110,50,130,50,150,50        
        dc.w    70,65,90,65,110,65,130,65,150,65        

swing_data_bank:
        dc.w    67,20,87,20,107,20,127,20,147,20        
        dc.w    73,35,93,35,113,35,133,35,153,35        
        dc.w    67,50,87,50,107,50,127,50,147,50        
swing_data_bank_spread:
        dc.w    73,65,93,65,113,65,133,65,153,65        
        dc.w    63,20,83,20,103,20,123,20,143,20        
        dc.w    73,35,93,35,113,35,133,35,153,35        
        dc.w    63,50,83,50,103,50,123,50,143,50        

low_data_bank:
        dc.w    70,54,90,54,110,54,130,54,150,54        
        dc.w    70,69,90,69,110,69,130,69,150,69        

multi_data_bank:
        dc.w    64,52,76,52,88,52,100,52,112,52,124,52,136,52,148,52    
        dc.w    64,61,76,61,88,61,100,61,112,61,124,61,136,61,148,61    
        dc.w    64,70,76,70,88,70,100,70,112,70,124,70,136,70,148,70    

******************************************** ENEMY DATA BLOCKS

        ;type, strength, width, height, image, data

Enemy_1:
        dc.w    U_ENTER,3,9,8,in_Enemy_1,FORM_STANDARD  
Enemy_1b:
        dc.w    SIMPLE_ENTER,3,9,8,in_Enemy_1,FORM_STANDARD  
Enemy_2:
        dc.w    SIMPLE_ENTER,4,11,8,in_Enemy_2,FORM_STANDARD
Enemy_9:
        dc.w    U_ENTER,6,6,5,in_Enemy_8,FORM_MODIFIED
Enemy_5:
        dc.w    PLAIN_ENTER,6,7,13,in_Enemy_5,FORM_ARROW
Enemy_3:
        dc.w    SPIN_ENTRY,8,10,10,in_Enemy3_1,FORM_SPIN1,82 
Enemy_4:
        dc.w    SPIN_ENTRY,12,10,10,in_Enemy4_1,FORM_SPIN2,82  
Enemy_7:
        dc.w    SPIN_ENTRY,20,10,10,in_Enemy7_1,FORM_SPIN3,42  
Enemy_6:
        dc.w    SIMPLE_ENTER,16,7,7,in_Enemy_6,FORM_CROSS     


Enemy_0:
        dc.w    OPERATOR_LOCATING,30,7,7,in_Enemy_0_5,-1        

E_Tri:  dc.w    TRIANGLE,16,13,11,in_Triangle,$101      
E_X:    dc.w    RANDOM_X,24,9,7,in_E_X,$101     

E_Boss1:
        dc.w    BOSS,40,17,14,in_Boss_1,-90     ; Standard boss
E_Boss2:
        dc.w    BOSS,50,17,14,in_Boss_2,-150    ; Second (fuzzy center) boss
E_Boss3:
        dc.w    BOSS,100,17,9,in_Boss_X,-100    ; Double-X Boss

E_SupL: dc.w    SUPERBOSS_L,150,17,11,in_SuperBoss_Left,-5      
E_SupR: dc.w    SUPERBOSS_R,150,16,11,in_SuperBoss_Right,-5     

E_fake: dc.w    FAKE1,32767,33,-100,in_fake,-5  ; Fake enemy for attaching

E_Swoop:
        dc.w    SWOOP,40,16,10,in_Swoop1        

E_MBL:  dc.w    MEGABOSS_L,1,17,17,in_MBL,1     
E_MBC:  dc.w    MEGABOSS_C,700,17,17,in_MBC,1   
E_MBR:  dc.w    MEGABOSS_R,1,17,17,in_MBR,1     

Enemy_10:
        dc.w    FIGURE,8,11,11,in_Enemy10_1,0,90

********************************************* MOVEMENT FIGURES

Figure_2_Start:
        dc.b    0,0
        dc.w    40
        dc.b    0,4
Figure_2_Loop:
        dc.w    20
        dc.b    0,4
        dc.w    12
        dc.b    2,2
        dc.w    20
        dc.b    4,0
        dc.w    64
        dc.b    4,-2
        dc.w    20
        dc.b    4,0
        dc.w    12
        dc.b    2,2
        dc.w    20
        dc.b    0,4
        dc.w    12
        dc.b    -2,2
        dc.w    20
        dc.b    -4,0
        dc.w    64
        dc.b    -4,-2
        dc.w    20
        dc.b    -4,0
        dc.w    12
        dc.b    -2,2
        dc.w    0
        dc.w    Figure_2_Loop-2-C_FIGURE

Figure_1_Start
        dc.b    0,0
        dc.w    40
        dc.b    0,4
Figure_1_Loop:
        dc.w    20
        dc.b    0,4
        dc.w    10
        dc.b    2,2
        dc.w    106
        dc.b    4,0
        dc.w    10
        dc.b    2,-2
        dc.w    20
        dc.b    0,-4
        dc.w    10
        dc.b    -2,-2
        dc.w    106
        dc.b    -4,0
        dc.w    10
        dc.b    -2,2
        dc.w    0
        dc.w    Figure_1_Loop-2-C_FIGURE

        EVEN