NoahJosephHall icon

Saturn Homebrew Menu v0.2

NoahJosephHall | PRO | 12/21/16 05:01:57 AM UTC | 0 ⭐ | 255 👁️ | Never ⏰ | []
C |

8.01 KB

|

None

|

0 👍

/

0 👎

#include <jo/jo.h>
 
#define LEV_ID      (0)
#define HITBOX_POS_X        (JO_TV_WIDTH_2)
#define HITBOX_POS_Y        (JO_TV_HEIGHT_2)
#define HITBOX_WIDTH        (32)
#define HITBOX_HEIGHT       (32)
 
int selection = 0;
int selections = 6;
 
int mode = 0;
 
int animspeed = 3;
 
float sscale = 1;
int rot = 0;
 
static int map_pos_x = 0;
static int map_pos_y = -160;
static int hitbox_sprite_id;
 
bool togtil = true;
bool togpar = true;
 
/*static int walk_width = 48;
static int walk_height = 48;*/
 
static int walk_id = 0;
 
static const jo_tile SonicWalk[] =
{
    {48 * 0, 0, 48, 48},
    {48 * 1, 0, 48, 48},
    {48 * 2, 0, 48, 48},
    {48 * 3, 0, 48, 48},
    {48 * 4, 0, 48, 48},
    {48 * 5, 0, 48, 48},
    {48 * 6, 0, 48, 48},    
    {48 * 7, 0, 48, 48},
    {48 * 8, 0, 48, 48},
    {48 * 9, 0, 48, 48},
    {48 * 10, 0, 48, 48},
    {48 * 11, 0, 48, 48},
};
 
static const items[] =
{
    {"Input Test"},
    {"Animation Demo"},
    {"Scaling and Rotation"},
    {"Parallax & Collision"},
    {"Mode 7"},
    {"Sounds"},
    {"Input-based Animation (Timeline)"},
    {"Saturn Sonic (Unavailable)"},
};
 
void menu(void)
{
    if(mode == 0){
        
    //If UP? Erase cursor -> Handle Overflow
    if(jo_is_pad1_key_down(JO_KEY_UP)){
        jo_printf(1, selection + 3, " ");
        if(selection == 0){
            selection = selections;
        } else{
            selection--;
        }
        draw();
    }
    
    //If DOWN? Erase cursor -> Handle Overflow
    if(jo_is_pad1_key_down(JO_KEY_DOWN)){
        jo_printf(1, selection + 3, " ");
        if(selection == selections){
            selection = 0;
        } else{
            selection++;
        }
        draw();
    }
    
    if(jo_is_pad1_key_down(JO_KEY_A)){
        if(selection == 0){
            mode = 1;
        }
        if(selection == 1){
            mode = 2;
        }
        if(selection == 2){
            mode = 3;
        }
        if(selection == 3){
            mode = 4;
            draw();
        }
        if(selection == 4){
            mode = 5;
        }
        if(selection == 5){
            mode = 6;
        }
        if(selection == 6){
            mode = 7;
        }
        if(selection == 7){
            mode = 8;
        }
    }
    
    }
    
    //Input
    if(mode == 1){
        jo_clear_screen();
        input();
    }
    
    //Sprite Animation
    if(mode == 2){
        jo_clear_screen();
        animation();
    }
    
    //Scale/Rotation
    if(mode == 3){
        jo_clear_screen();
        scalerot();
    }
    
    //Tiles and Parallax
    if(mode == 4){
        jo_map_draw(LEV_ID, map_pos_x, map_pos_y);
        parallax();
    }
}
 
void    draw(void)
{
    if(mode == 0){
    
    jo_clear_background(JO_COLOR_Black);
    
    jo_clear_screen();
    
    //Main
    jo_printf(1, 1, "Saturn Sonic V.0.0.0.0.1");
    
    //Cursor
    jo_printf(1, selection + 3, ">");
    
    //Display items
    jo_printf(2, 3, items[0]);
    jo_printf(2, 3 + 1, items[1]);
    jo_printf(2, 3 + 2, items[2]);
    jo_printf(2, 3 + 3, items[3]);
    jo_printf(2, 3 + 4, items[4]);
    jo_printf(2, 3 + 5, items[5]);
    jo_printf(2, 3 + 6, items[6]);
    jo_printf(2, 3 + 7, items[7]);
    }
    
    if(mode == 1){
        //NULL
    }
    
    if(mode == 2){
        sonic_setup();
    }
    
    if(mode == 3){
        sonic_setup();
    }
    
    if(mode == 4){
        map_load();
    }
    
}
 
void    input(void)
{
    if (!jo_is_pad1_available()){
        return;
    }
    
    jo_clear_background(JO_COLOR_SemiBlue);
    
    jo_printf(1, 1, "Hold A, B, and C to return");
    
    //Inputs
    jo_printf(30, 1, "INPUTS:");
    jo_printf(30, 3, "A:");
    jo_printf(30, 5, "B:");
    jo_printf(30, 7, "C:");
    jo_printf(30, 9, "L:");
    jo_printf(30, 11, "R:");
    jo_printf(30, 13, "U:");
    jo_printf(30, 15, "D:");
    jo_printf(30, 17, "<:");
    jo_printf(30, 19, ">:");
    
    if(jo_is_pad1_key_pressed(JO_KEY_A) && jo_is_pad1_key_pressed(JO_KEY_B) && jo_is_pad1_key_pressed(JO_KEY_C)){
        back();
        return;
    }
        
    //A 
    if(jo_is_pad1_key_pressed(JO_KEY_A)){
        jo_printf(32, 3, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_A)){ 
        jo_printf(32, 3, "FALSE"); 
    }
    
    //B
    if(jo_is_pad1_key_pressed(JO_KEY_B)){
        jo_printf(32, 5, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_B)){ 
        jo_printf(32, 5, "FALSE"); 
    }
    
    //C
    if(jo_is_pad1_key_pressed(JO_KEY_C)){
        jo_printf(32, 7, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_C)){ 
        jo_printf(32, 7, "FALSE"); 
    }
    
    //L
    if(jo_is_pad1_key_pressed(JO_KEY_L)){
        jo_printf(32, 9, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_L)){ 
        jo_printf(32, 9, "FALSE"); 
    }
    
    //R
    if(jo_is_pad1_key_pressed(JO_KEY_R)){
        jo_printf(32, 11, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_R)){ 
        jo_printf(32, 11, "FALSE"); 
    }
    
    //UP
    if(jo_is_pad1_key_pressed(JO_KEY_UP)){
        jo_printf(32, 13, "TRUE ");
        draw();
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_UP)){ 
        jo_printf(32, 13, "FALSE"); 
    }
    
    //DOWN
    if(jo_is_pad1_key_pressed(JO_KEY_DOWN)){
        jo_printf(32, 15, "TRUE ");
        draw();
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_DOWN)){ 
        jo_printf(32, 15, "FALSE"); 
    }
    
    //LEFT  
    if(jo_is_pad1_key_pressed(JO_KEY_LEFT)){
        jo_printf(32, 17, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_LEFT)){ 
        jo_printf(32, 17, "FALSE"); 
    }
    
    //RIGHT
    if(jo_is_pad1_key_pressed(JO_KEY_RIGHT)){
        jo_printf(32, 19, "TRUE ");
    } 
    if(!jo_is_pad1_key_pressed(JO_KEY_RIGHT)){ 
        jo_printf(32, 19, "FALSE"); 
    }
    
    
}
 
void    animation(void)
{
    
    jo_clear_background(JO_COLOR_SemiPurple);
 
    jo_printf(1, 1, "Animation Demo");
    jo_printf(1, 2, "Press B to return");
    jo_printf(1, 4, "<: Decrease Animation Speed");
    jo_printf(1, 5, ">: Increase Animation Speed");
    jo_printf(1, 20, "I'm not sure why, but"); 
    jo_printf(1, 21, "animation framerates can only be"); 
    jo_printf(1, 22, "displayed at whole-integer");
    jo_printf(1, 23, "intervals. The difference in speeds");
    jo_printf(1, 24, "will be noticeable. This can be");
    jo_printf(1, 25, "fixed with timeline-based animation.");
    
    
    jo_sprite_draw3D(jo_get_anim_sprite(walk_id), -15, -15, 490);
    
    jo_set_sprite_anim_frame_rate(walk_id, animspeed);
    
    if(animspeed < 0){
        animspeed = 0;
    }
    
    if(jo_is_pad1_key_down(JO_KEY_RIGHT)){
        animspeed--;
    }
    if(jo_is_pad1_key_down(JO_KEY_LEFT)){
        animspeed++;
    }
    
    if(jo_is_pad1_key_pressed(JO_KEY_B)){
        back();
        return;
    }
        
}
 
void scalerot(void)
{
    jo_clear_background(JO_COLOR_SemiGreen);
    
    jo_printf(1, 1, "Scale and Rotation Demo");
    jo_printf(1, 2, "Press B to return");
    jo_printf(1, 4, "</>: Rotate Left/Right");
    jo_printf(1, 5, "U/D: Inc/Dec Scale");
    jo_printf(1, 7, "A: Reset");
    
    jo_sprite_draw3D_and_rotate(jo_get_anim_sprite(walk_id), -15, -15, 490, rot);
    jo_set_sprite_anim_frame_rate(walk_id, 3);
    jo_sprite_change_sprite_scale(sscale);
    
    if(jo_is_pad1_key_pressed(JO_KEY_RIGHT)){
            rot--;
    }
    if(jo_is_pad1_key_pressed(JO_KEY_LEFT)){
            rot++;
    }
    if(jo_is_pad1_key_pressed(JO_KEY_DOWN)){
            sscale-=0.02;
    }
    if(jo_is_pad1_key_pressed(JO_KEY_UP)){
            sscale+=0.02;
    }
    
    if(jo_is_pad1_key_pressed(JO_KEY_A)){
            sscale = 1;
            rot = 0;
    }
    
    if(jo_is_pad1_key_pressed(JO_KEY_B)){
        back();
        return;
    }
}
 
void    parallax(void)
{   
    jo_clear_background(JO_COLOR_DarkRed);
    
    jo_clear_screen();
    
    jo_printf(1, 1, "Tiles, Parallax, & Sprite Collision");
    jo_printf(1, 2, "Press B to return");
    jo_printf(1, 4, "(Just tiles for now.");
    jo_printf(1, 5, "Parallax comes tomorrow.)");
    
    if (!jo_is_pad1_available())
        return ;
    if (jo_is_pad1_key_pressed(JO_KEY_LEFT))
        map_pos_x -= 2;
    if (jo_is_pad1_key_pressed(JO_KEY_RIGHT))
        map_pos_x += 2;
    if (jo_is_pad1_key_pressed(JO_KEY_UP))
        map_pos_y -= 2;
    if (jo_is_pad1_key_pressed(JO_KEY_DOWN))
        map_pos_y += 2;
    
    if(jo_is_pad1_key_pressed(JO_KEY_B)){
        back();
        return;
    }
 
        
}
 
void    back(void)
{
    mode = 0;
    menu();
    draw(); 
}
 
void    sonic_setup(void)
{
    int sprite_id = jo_sprite_add_bin_tileset("SONIC", "WALK.BIN", JO_COLOR_Green, SonicWalk, JO_TILE_COUNT(SonicWalk));    
    walk_id = jo_create_sprite_anim(sprite_id, JO_TILE_COUNT(SonicWalk), animspeed);
    jo_start_sprite_anim_loop(walk_id);
}
 
void    map_load(void)
{
    jo_map_load_from_file(LEV_ID, 450, "LEV", "LEV.MAP");
    
    jo_sprite_add_image_pack("BLK", "BLK.TEX", JO_COLOR_Red);
}
 
void    jo_main(void)
{
    jo_core_init(JO_COLOR_Black);
    draw();
    map_load();
    jo_core_add_callback(menu);
    sonic_setup();
    jo_core_run();
}
 
/*
** END OF FILE
*/

Comments