Advertisement
Threef

Flappy Souls

Sep 16th, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ///sc_flappysouls()
  2. /*
  3.  
  4. Flappy Souls by Threef
  5.  
  6. Use space to fly and try to avoid hitting walls.
  7. Eveytime you die you'll destroy the piece of wall you hit.
  8. Next time your ghost will fly ahead of you showinng you path you flown.
  9. Seed of game resets every day. That means your progress resets at 00:00.
  10.  
  11. */
  12.  
  13. enum gamestate {
  14.     play,
  15.     death,
  16.     menu
  17. }
  18.  
  19. var map=0;
  20. var grav=0.7;
  21. var jumpPower=15;
  22. var hspd=6
  23. var ghostDistance=16;//192;
  24. var enemiesDistance=48;//64
  25.  
  26. var playSounds=true; //Change to false if you don't want to hear it
  27.  
  28.  
  29. if(!ds_exists(map,ds_type_map)) {
  30.     //Init
  31.     room_speed=60
  32.     random_set_seed(date_date_of(date_current_datetime()))
  33.     background_colour=$333333
  34.     display_set_windows_alternate_sync(1)
  35.    
  36.     view_enabled=true
  37.     view_visible[0]=true
  38.     view_xview[0]=-view_wview[0]
  39.    
  40.     var data=ds_map_create();
  41.    
  42.     if(file_exists("data.json")) {
  43.         var f=file_text_open_read("data.json");
  44.         var s=file_text_read_string(f);
  45.         data=json_decode(s)
  46.         file_text_close(f)
  47.        
  48.         //show_debug_message(json_encode(data))
  49.        
  50.         if(data[?"seed"]!=random_get_seed()) {
  51.             ds_list_clear(data[?"prev runs"])
  52.             ds_list_clear(data[?"enemies"])
  53.         }          
  54.        
  55.         ds_map_copy(0,data)
  56.         ds_map_add_map(0, "this run", data[?"this run"])
  57.         ds_map_add_list(0, "enemies", data[?"enemies"])
  58.         ds_map_add_list(0, "prev runs", data[?"prev runs"])
  59.         //ds_map_destroy(data)
  60.         data=0    
  61.     } else {                
  62.         data[?"seed"]=random_get_seed()
  63.         data[?"game step"]=0        
  64.        
  65.         ds_map_add_list(data, "prev runs", ds_list_create())
  66.        
  67.         ds_map_add_map(data, "this run", ds_map_create())
  68.         ds_map_add_list(data[?"this run"], "key press list", ds_list_create())
  69.         ds_map_add(data[?"this run"], "x", room_width/2)
  70.         ds_map_add(data[?"this run"], "y", room_height/2)
  71.         ds_map_add(data[?"this run"], "vspeed", 0)
  72.         ds_map_add(data[?"this run"], "number", 1)
  73.            
  74.         ds_map_add_list(data, "enemies", ds_list_create())
  75.     }
  76.    
  77.     data[?"game state"]=gamestate.menu
  78.    
  79.     data[?"surface bird"]=-4
  80.     data[?"surface enemy"]=-4
  81.     data[?"surface ghosts"]=-4
  82.     data[?"sound death"]=-4
  83.     data[?"sound jump"]=-4
  84.    
  85.     data[?"surface text - you died"]=-4
  86.     data[?"surface text - PRESS SPACE"]=-4
  87.     data[?"surface text - FLAPPY SOULS"]=-4
  88.     data[?"surface text - PRESS SPACE TO PLAY"]=-4
  89.    
  90.     //show_debug_message(json_encode(data))
  91.    
  92. } else {
  93.     //Main game loop
  94.     var data=map;
  95.    
  96.     //Clear buffers in next game loop
  97.     for(var i=0; i<10; i++) {
  98.         if(buffer_exists(i)) {
  99.             //buffer_delete(i)
  100.         }
  101.     }
  102.    
  103.     //Create bird sprite
  104.     if(!sprite_exists(data[?"surface bird"])) {
  105.         var w=180
  106.         var h=160
  107.         var s=surface_create(w,h)
  108.         surface_set_target(s)
  109.         draw_set_color($999999)
  110.         draw_circle(w/2,h/2,64,0)
  111.        
  112.         draw_triangle(w/2+5,h/2-64-6,w/2-5,h/2-64+5,w/2,h/2-64+8,0)
  113.         draw_triangle(w/2+12,h/2-64-7,w/2-5,h/2-64+5,w/2,h/2-64+8,0)
  114.         draw_triangle(w/2+16,h/2-64-9,w/2-3,h/2-64+5,w/2+2,h/2-64+8,0)
  115.        
  116.         draw_ellipse(w/2 -90,h/2 -24,w/2 -44,h/2 -4,0)
  117.         draw_ellipse(w/2 -75,h/2 -15,w/2 -44,h/2 +6,0)
  118.         draw_ellipse(w/2 +90,h/2 -24,w/2 +44,h/2 -4,0)
  119.         draw_ellipse(w/2 +75,h/2 -15,w/2 +44,h/2 +6,0)        
  120.        
  121.         draw_set_blend_mode_ext(bm_dest_alpha, bm_src_alpha)
  122.         draw_set_colour($bbbbbb)
  123.         draw_ellipse(w/2-64-16,w/2-16,w/2+64+16,w/2+64+22,0)        
  124.         draw_set_blend_mode(bm_normal)
  125.        
  126.         draw_set_colour($777777)
  127.         draw_circle(w/2-32,w/2-32,4,0)
  128.         draw_circle(w/2-32+64,w/2-32,4,0)
  129.        
  130.         draw_set_colour($bbbbbb)
  131.         draw_ellipse(w/2-18,w/2-16-5,w/2+18,w/2-16+5,0)
  132.        
  133.         surface_reset_target()
  134.         data[?"surface bird"]=sprite_create_from_surface(s,0,0,w,h,0,0,w/2,h/2)
  135.         surface_free(s)
  136.    
  137.     }
  138.    
  139.     //Create enemy
  140.     if(!surface_exists(data[?"surface enemy"])) {
  141.         data[?"surface enemy"]=surface_create(128,128)
  142.         surface_set_target(data[?"surface enemy"])
  143.         draw_set_color(c_white)
  144.         draw_circle(64,64,64,0)
  145.         surface_reset_target()
  146.     }
  147.    
  148.     //Create sounds
  149.     if(data[?"sound death"]=-4 && !audio_exists(data[?"sound death"])) {
  150.         var rate = 50000; //44100;
  151.         var parts = 4;
  152.         var hertz = 400;
  153.         var samples = 44100;
  154.         var bufferId = buffer_create(rate, buffer_fast, 1);
  155.         buffer_seek(bufferId, buffer_seek_start, 0);
  156.         for(var p=0; p<parts; p++) {
  157.             var num_to_write = rate / hertz;
  158.             var val_to_write = 1;
  159.             for (var i = 0; i < (samples / parts / num_to_write) + 1; i++;) {
  160.                for (var j = 0; j < num_to_write; j++;) {
  161.                   buffer_write(bufferId, buffer_u8, val_to_write * 255);
  162.                }
  163.                val_to_write = (1 - val_to_write);
  164.             }
  165.            
  166.             hertz -= 50
  167.         }
  168.         data[?"sound death"] = audio_create_buffer_sound(bufferId, buffer_u8, rate, 0, samples, audio_mono);
  169.         //buffer_delete(bufferId)
  170.     }
  171.    
  172.     if(data[?"sound jump"]=-4 && !audio_exists(data[?"sound jump"])) {
  173.         var rate = 44100;
  174.         var parts = 3;
  175.         var hertz = 540;
  176.         var samples = 4410;
  177.         var bufferId = buffer_create(rate, buffer_fast, 1);
  178.         buffer_seek(bufferId, buffer_seek_start, 0);
  179.         for(var p=0; p<parts; p++) {
  180.             var num_to_write = rate / hertz;
  181.             var val_to_write = 1;
  182.             for (var i = 0; i < (samples / parts / num_to_write) + 1; i++;) {
  183.                for (var j = 0; j < num_to_write; j++;) {
  184.                   buffer_write(bufferId, buffer_u8, val_to_write * 255);
  185.                }
  186.                val_to_write = (1 - val_to_write);
  187.             }
  188.            
  189.             hertz -= 40
  190.         }
  191.         data[?"sound jump"] = audio_create_buffer_sound(bufferId, buffer_u8, rate, 0, samples, audio_mono);
  192.         //buffer_delete(bufferId)
  193.     }
  194.    
  195.     //Create texts
  196.     if(!surface_exists(data[?"surface text - FLAPPY SOULS"])) {
  197.         var pixel_width=6;
  198.         var pixel_height=7;
  199.         var text="";
  200.         text[0]= "                                                                                                                                                                "
  201.         text[1]= "           BBBBBBBBBBBBBB  BBBBBBBBBBBBBBB   BBBBBBBB   BBBBBBBBBBBBB           XXXXXXXXXXX     XXXXXXXX     XXXXX        XXX  XXXXX             XXXXXXXXXXX    "
  202.         text[2]= "          BXXXXXXXXBXXXXB BXXXXXXXBXXXXXXXBB BXXXXXXXBB BXXXXXBXXXXXB        XXXXX      XX    XXX       XX    XXX          X    XXX           XXXXX      XX     "
  203.         text[3]= "         BXXXXXXXXXBXXXXBBXXXXXXXXBXXXXXXXXXBBXXXXXXXXXBBXXXXXBXXXXXB       XXXX         X   XXX          X   XXX          X    XXX          XXXX         X     "
  204.         text[4]= "         BXXXXBBBBBBXXXXBXXXXXXXXXBXXXXXXXXXXBXXXXXXXXXXBXXXXXBXXXXXB       XXXX             XXX          X   XXX          X    XXX          XXXX               "
  205.         text[5]= "         BXXXXXXXXXBXXXXBXXXXXXXXXBXXXXXXXXXXBXXXXXXXXXXBXXXXXBXXXXXB       XXXXX            XXX          X   XXX          X    XXX          XXXXX              "
  206.         text[6]= "         BXXXXXXXXXBXXXXBXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXXB        XXXXXX          XXX          X   XXX          X    XXX           XXXXXX            "
  207.         text[7]= "         BXXXXXXXXXBXXXXBXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXXB         XXXXXXX        XXX          X   XXX          X    XXX            XXXXXXX          "
  208.         text[8]= "         BXXXXBBBBBBXXXXBXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXBXXXXXXXXXXXBBBBBBBBBBBBXXXXXXBBBBBBBXXXBBBBBBBBBBXBBBXXXBBBBBBBBBBXBBBBXXXBBBBBBBBBBBBBBXXXXXXBBBBBBBBB"
  209.         text[9]= "         BXXXXBBBBBBXXXXBXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXBXXXXXXXXXXXB             XXXXXX     XXX          X   XXX          X    XXX                XXXXXX       "
  210.         text[10]="         BXXXXB    BXXXXBXXXXBXXXXBXXXXXBXXXXBXXXXXBXXXXBBXXXXXXXXXXB               XXXXXX   XXX          X   XXX          X    XXX                  XXXXXX     "
  211.         text[11]="         BXXXXB    BXXXXBXXXXXXXXXBXXXXXXXXXXBXXXXXXXXXXBBBXXXXXXXXXB                 XXXXX  XXX          X   XXX          X    XXX                    XXXXX    "
  212.         text[12]="         BXXXXB    BXXXXBBXXXXXXXXBXXXXXXXXXBBXXXXXXXXXBB BBBBXXXXXXB                  XXXX  XXX          X   XXX          X    XXX                     XXXX    "
  213.         text[13]="         BXXXXB    BXXXXBBBXXXXXXXBXXXXXXXXBBBXXXXXXXXBB   BBBXXXXXXB        X         XXXX  XXX          X   XXX          X    XXX           X         XXXX    "
  214.         text[14]="         BBBBBB    BBBBBB  BBBBBBBBXXXXXBBBB BXXXXXBBBB     BXXXXXXXB        XX      XXXXX    XXX       XX     XXX       XX     XXX       X   XX      XXXXX     "
  215.         text[15]="         BBBBBB    BBBBBB   BBBBBBBXXXXXBBB  BXXXXXBBB      BXXXXXXXB       XXXXXXXXXXX         XXXXXXXX         XXXXXXXX      XXXXXXXXXXXX  XXXXXXXXXXX        "
  216.         text[16]="                                  BXXXXXB    BXXXXXB        BXXXXXXBB                                                                                           "
  217.         text[17]="                                  BXXXXXB    BXXXXXB        BXXXXXBB                                                                                            "
  218.         text[18]="                                  BBBBBBB    BBBBBBB        BBBBBBB                                                                                             "
  219.         text[19]="                                  BBBBBBB    BBBBBBB        BBBBB                                                                                               "
  220.        
  221.        
  222.         data[?"surface text - FLAPPY SOULS"]=surface_create(string_length(text[0])*pixel_width, array_length_1d(text)*pixel_height)
  223.        
  224.         surface_set_target(data[?"surface text - FLAPPY SOULS"])
  225.         draw_clear_alpha(0,0)
  226.         draw_set_color(c_white)
  227.         for(var _y=0; _y<array_length_1d(text); _y++)
  228.         for(var _x=0; _x<string_length(text[0]); _x++) {
  229.             if(string_char_at(text[_y],_x+1)="X") {
  230.                 draw_set_color(c_white)
  231.                 draw_rectangle(_x*pixel_width,_y*pixel_height,(_x+1)*pixel_width-1,(_y+1)*pixel_height-1,0)
  232.             }
  233.             if(string_char_at(text[_y],_x+1)="B") {
  234.                 draw_set_color($333333)
  235.                 draw_rectangle(_x*pixel_width,_y*pixel_height,(_x+1)*pixel_width-1,(_y+1)*pixel_height-1,0)
  236.             }
  237.         }
  238.         surface_reset_target()
  239.     }
  240.    
  241.     if(!surface_exists(data[?"surface text - PRESS SPACE TO PLAY"])) {
  242.         var pixel_width=8;
  243.         var pixel_height=10;
  244.         var text="";
  245.         text[0]="                                                                                                    "
  246.         text[1]=" XXXX  XXXX  XXXXX  XXX   XXX     XXX XXXX   XXX   XXX XXXX   XXXXX  XXX    XXXX  X     XXX  X   X  "
  247.         text[2]=" X   X X   X X     X     X       X    X   X X   X X    X        X   X   X   X   X X    X   X X   X  "
  248.         text[3]=" X   X X   X X     X     X       X    X   X X   X X    X        X   X   X   X   X X    X   X X   X  "
  249.         text[4]=" XXXX  XXXX  XXXX  XXXX  XXXX    XXXX XXXX  XXXXX X    XXX      X   X   X   XXXX  X    XXXXX  X X   "
  250.         text[5]=" X     X X   X        X     X       X X     X   X X    X        X   X   X   X     X    X   X   X    "
  251.         text[6]=" X     X  X  X        X     X       X X     X   X X    X        X   X   X   X     X    X   X   X    "
  252.         text[7]=" X     X   X XXXXX XXX   XXX     XXX  X     X   X  XXX XXXX     X    XXX    X     XXXX X   X   X    "
  253.        
  254.        
  255.         data[?"surface text - PRESS SPACE TO PLAY"]=surface_create(string_length(text[0])*pixel_width, array_length_1d(text)*pixel_height)
  256.        
  257.         surface_set_target(data[?"surface text - PRESS SPACE TO PLAY"])
  258.         draw_clear_alpha(0,0)
  259.         draw_set_color(c_white)
  260.         for(var _y=0; _y<array_length_1d(text); _y++)
  261.         for(var _x=0; _x<string_length(text[0]); _x++) {
  262.             if(string_char_at(text[_y],_x+1)="X") {
  263.                 draw_rectangle(_x*pixel_width,_y*pixel_height,(_x+1)*pixel_width-1,(_y+1)*pixel_height-1,0)
  264.             }
  265.         }
  266.         surface_reset_target()
  267.     }
  268.    
  269.     if(!surface_exists(data[?"surface text - you died"])) {
  270.         var pixel_width=12;
  271.         var pixel_height=16;
  272.         var text="";
  273.         text[0]="                                              "
  274.         text[1]=" X   X  XXX  X   X   XXXX  X XXXXX XXXX  XX   "
  275.         text[2]=" X   X X   X X   X   X   X X X     X   X XX   "
  276.         text[3]="  X X  X   X X   X   X   X X X     X   X XX   "
  277.         text[4]="   X   X   X X   X   X   X X XXXX  X   X XX   "
  278.         text[5]="   X   X   X X   X   X   X X X     X   X XX   "
  279.         text[6]="   X   X   X X   X   X   X X X     X   X      "
  280.         text[7]="   X    XXX   XXX    XXXX  X XXXXX XXXX  XX   "
  281.        
  282.        
  283.         data[?"surface text - you died"]=surface_create(string_length(text[0])*pixel_width, array_length_1d(text)*pixel_height)
  284.        
  285.         surface_set_target(data[?"surface text - you died"])
  286.         draw_clear_alpha(0,0)
  287.         draw_set_color(c_white)
  288.         for(var _y=0; _y<array_length_1d(text); _y++)
  289.         for(var _x=0; _x<string_length(text[0]); _x++) {
  290.             if(string_char_at(text[_y],_x+1)="X") {
  291.                 draw_rectangle(_x*pixel_width,_y*pixel_height,(_x+1)*pixel_width-1,(_y+1)*pixel_height-1,0)
  292.             }
  293.         }
  294.         surface_reset_target()
  295.     }
  296.    
  297.     if(!surface_exists(data[?"surface text - PRESS SPACE"])) {
  298.         var pixel_width=6;
  299.         var pixel_height=5;
  300.         var text="";
  301.         text[0]="                                                             "
  302.         text[1]=" XXXX  XXXX  XXXXX  XXX   XXX     XXX XXXX   XXX   XXX XXXX "
  303.         text[2]=" X   X X   X X     X     X       X    X   X X   X X    X    "
  304.         text[3]=" X   X X   X X     X     X       X    X   X X   X X    X    "
  305.         text[4]=" XXXX  XXXX  XXXX  XXXX  XXXX    XXXX XXXX  XXXXX X    XXX  "
  306.         text[5]=" X     X X   X        X     X       X X     X   X X    X    "
  307.         text[6]=" X     X  X  X        X     X       X X     X   X X    X    "
  308.         text[7]=" X     X   X XXXXX XXX   XXX     XXX  X     X   X  XXX XXXX "
  309.        
  310.        
  311.         data[?"surface text - PRESS SPACE"]=surface_create(string_length(text[0])*pixel_width, array_length_1d(text)*pixel_height)
  312.        
  313.         surface_set_target(data[?"surface text - PRESS SPACE"])
  314.         draw_clear_alpha(0,0)
  315.         draw_set_color(c_white)
  316.         for(var _y=0; _y<array_length_1d(text); _y++)
  317.         for(var _x=0; _x<string_length(text[0]); _x++) {
  318.             if(string_char_at(text[_y],_x+1)="X") {
  319.                 draw_rectangle(_x*pixel_width,_y*pixel_height,(_x+1)*pixel_width-1,(_y+1)*pixel_height-1,0)
  320.             }
  321.         }
  322.         surface_reset_target()
  323.     }
  324.    
  325.     //Draw mountains
  326.     draw_set_colour($222222)
  327.     draw_rectangle(view_xview[0], 0, view_xview[0]+view_wview[0], (room_height*0.6), 0)
  328.     for(var i=(view_xview[0]-view_wview[0]/2)-(view_xview[0]%128); i<view_xview[0]+view_wview[0]*3/2; i+=128) {        
  329.         var _y=(room_height*0.6)+dsin(i)*16
  330.         var _h=64
  331.         draw_ellipse(i-150, _y-_h,i+150, _y+_h,0)
  332.     }
  333.    
  334.     if(data[?"game state"]=gamestate.play || data[?"game state"]=gamestate.death) {
  335.         var myBird=data[?"this run"];
  336.        
  337.         //Enemies
  338.         for(var n=0; n<ds_list_size(data[?"enemies"]); n++) {
  339.             var currentEnemy=ds_list_find_value(data[?"enemies"], n);
  340.  
  341.             if((!ds_map_exists(currentEnemy,"death") || currentEnemy[?"death"]>data[?"game step"]) && currentEnemy[?"y"]<room_height+64 && currentEnemy[?"x"]>view_xview[0]-64 && currentEnemy[?"x"]<view_xview[0]+view_wview[0]+64) {
  342.                 var color=$777777;
  343.                 if(ds_map_exists(currentEnemy,"death")) {
  344.                     color=$666666
  345.                 }
  346.                 if(surface_exists(currentEnemy[?"image"])) {
  347.                     draw_surface_ext(currentEnemy[?"image"], round(currentEnemy[?"x"]-64), round(currentEnemy[?"y"]-64), 1, 1, 0, color, 1)
  348.                 }
  349.             }
  350.         }
  351.    
  352.         //Previous runs
  353.         if(!surface_exists(data[?"surface ghosts"])) {
  354.             data[?"surface ghosts"]=surface_create(view_wview[0],view_hview[0])
  355.         }
  356.        
  357.         surface_set_target(data[?"surface ghosts"])
  358.         draw_clear_alpha(0,0)
  359.         for(var n=0; n<ds_list_size(data[?"prev runs"]); n++) {
  360.             var currentGhost=ds_list_find_value(data[?"prev runs"], n);
  361.        
  362.             currentGhost[?"x"]+=hspd
  363.             currentGhost[?"y"]+=currentGhost[?"vspeed"]
  364.             currentGhost[?"y"]=clamp(currentGhost[?"y"],0-64,room_width+64)
  365.             currentGhost[?"vspeed"]+=grav //Gravity
  366.            
  367.             if(ds_exists(currentGhost[?"key press list"], ds_type_list) && ds_list_find_index(currentGhost[?"key press list"], currentGhost[?"live"])!=-1) {
  368.                 currentGhost[?"vspeed"]=-jumpPower
  369.             }
  370.            
  371.             var angle=0;
  372.             if(currentGhost[?"live"]>currentGhost[?"death"]) {
  373.                 angle=max(-60,currentGhost[?"death"]-currentGhost[?"live"])*3
  374.             }
  375.            
  376.             if(currentGhost[?"y"]<room_height+64 && currentGhost[?"x"]>view_xview[0]-64 && currentGhost[?"x"]<view_xview[0]+view_wview[0]+64) {
  377.                 if(sprite_exists(data[?"surface bird"])) {
  378.                     draw_sprite_ext(data[?"surface bird"], 0, round(currentGhost[?"x"]-view_xview[0]), round(currentGhost[?"y"]-view_yview[0]), 1, 1, sin(currentGhost[?"x"]/30)*10-angle, $777777, 1)
  379.                 }
  380.             }
  381.            
  382.             currentGhost[?"live"]++
  383.         }        
  384.         surface_reset_target()
  385.         draw_surface_ext(data[?"surface ghosts"],view_xview[0],view_yview[0],1,1,0,c_white,0.1)
  386.         //surface_free(data[?"surface ghosts"])
  387.        
  388.         //Player sprite
  389.         var myBird=data[?"this run"];
  390.         myBird[?"x"]+=hspd
  391.         myBird[?"y"]+=myBird[?"vspeed"]
  392.         myBird[?"y"]=clamp(myBird[?"y"],0-64,room_width+64)
  393.         myBird[?"vspeed"]+=grav //Gravity
  394.  
  395.         var angle=0;
  396.         if(data[?"game step"]>myBird[?"death"]) {
  397.             angle=max(-60,myBird[?"death"]-data[?"game step"])*3
  398.         }
  399.        
  400.         if(sprite_exists(data[?"surface bird"])) {
  401.             draw_sprite_ext(data[?"surface bird"], 0, round(myBird[?"x"]), round(myBird[?"y"]), 1, 1, sin(myBird[?"x"]/30)*10-angle, $777777, 1)
  402.         }
  403.     }
  404.    
  405.     if(data[?"game state"]=gamestate.play) {        
  406.         //Game
  407.         var myBird=data[?"this run"];        
  408.        
  409.         //view_xview[0]=floor(lerp(view_xview[0], myBird[?"x"]-view_wview[0]*0.2, 2/room_speed))
  410.         view_xview[0]=floor(lerp(view_xview[0], myBird[?"x"]-view_wview[0]*0.2, 0.1))
  411.        
  412.         if(keyboard_check_pressed(vk_space)) {
  413.             var kpl=myBird[?"key press list"];
  414.             ds_list_add(kpl, data[?"game step"])
  415.             myBird[?"vspeed"]=-jumpPower
  416.            
  417.             if(playSounds && !audio_is_playing(data[?"sound jump"])) {
  418.                 audio_play_sound(data[?"sound jump"],1,0)
  419.             }
  420.         }
  421.        
  422.         //draw_surface_ext(data[?"surface bird"], round(myBird[?"x"]-64), round(myBird[?"y"]-64), 1, 1, 0, $777777, 1)        
  423.        
  424.         if(myBird[?"y"]>room_height+64 || myBird[?"y"]<-64) {
  425.             data[?"game state"]=gamestate.death
  426.             myBird[?"death"]=data[?"game step"]
  427.            
  428.             if(playSounds && !audio_is_playing(data[?"sound death"])) {
  429.                 audio_play_sound(data[?"sound death"],1,0)
  430.             }
  431.         }
  432.        
  433.         //Enemies
  434.         var enemies=data[?"enemies"];
  435.         if(ds_list_empty(enemies)) {
  436.             var enemy=ds_map_create();
  437.             enemy[?"x"]=max(view_xview[0],0)+view_wview[0]
  438.             enemy[?"y"]=view_hview[0]-irandom(view_hview[0]/3)
  439.             enemy[?"image"]=data[?"surface enemy"]
  440.             enemy[?"death"]=-1
  441.             ds_list_add(enemies,enemy)
  442.             ds_list_mark_as_map(enemies, ds_list_size(enemies)-1)
  443.         }
  444.        
  445.         for(var n=0; n<ds_list_size(enemies); n++) {
  446.             var enemy=enemies[|n];
  447.            
  448.             //Check collision
  449.             if(!ds_map_exists(enemy,"death") && sqr(abs(enemy[?"x"]-myBird[?"x"]))+sqr(abs(enemy[?"y"]-myBird[?"y"]))<sqr(64+64)) {
  450.                 data[?"game state"]=gamestate.death
  451.                 enemy[?"death"]=data[?"game step"]
  452.                 myBird[?"death"]=data[?"game step"]
  453.                
  454.                 if(playSounds && !audio_is_playing(data[?"sound death"])) {
  455.                     audio_play_sound(data[?"sound death"],1,0)
  456.                 }
  457.             }
  458.         }
  459.  
  460.         //Spawn more enemies
  461.         var lastEnemy=enemies[|ds_list_size(enemies)-1];
  462.         if(lastEnemy[?"x"]<max(view_xview[0],0)+view_wview[0]+enemiesDistance) {
  463.             var used=false;
  464.             for(var _y=0; _y<=room_height+enemiesDistance; _y+=enemiesDistance) {
  465.                
  466.                 var enemy=ds_map_create();
  467.                 enemy[?"x"]=lastEnemy[?"x"]+enemiesDistance
  468.                 enemy[?"y"]=_y
  469.                 enemy[?"image"]=data[?"surface enemy"]
  470.    
  471.                 ds_list_add(enemies,enemy)
  472.                 ds_list_mark_as_map(enemies, ds_list_size(enemies)-1)
  473.                
  474.                 if(used=false && random(100)<60 && _y>=enemiesDistance) {
  475.                     _y+=room_height*random_range(0.5,0.8)
  476.                     _y=ceil(_y/enemiesDistance)*enemiesDistance
  477.                     used=true
  478.                 }
  479.                
  480.             }
  481.         }
  482.                
  483.     }
  484.    
  485.     if(data[?"game state"]=gamestate.play || data[?"game state"]=gamestate.death) {
  486.         //Move time
  487.         data[?"game step"]++
  488.     }
  489.    
  490.     if(data[?"game state"]=gamestate.death) {
  491.        
  492.         //On death reset game
  493.         if(keyboard_check_pressed(vk_space) || keyboard_check_pressed(vk_escape)) {
  494.            
  495.             data[?"game state"]=gamestate.play
  496.             var tr=data[?"this run"];
  497.                                  
  498.             //Reset variables to init values        
  499.             for(var n=0; n<ds_list_size(data[?"prev runs"]); n++) {
  500.                 var currentGhost=ds_list_find_value(data[?"prev runs"], n);
  501.                 currentGhost[?"x"]=room_width/2
  502.                 currentGhost[?"y"]=room_height/2
  503.                 currentGhost[?"vspeed"]=0
  504.                 currentGhost[?"live"]=0
  505.             }
  506.            
  507.             //Save this run as a ghost
  508.             var ghost=ds_map_create();
  509.            
  510.             ghost[?"x"]=room_width/2
  511.             ghost[?"y"]=room_height/2
  512.             ghost[?"vspeed"]=0
  513.             ghost[?"live"]=0
  514.             ghost[?"death"]=tr[?"death"]
  515.             ghost[?"number"]=tr[?"number"]
  516.             var kpl=ds_list_create();
  517.            
  518.             ds_list_copy(kpl, tr[?"key press list"])
  519.             ds_map_add_list(ghost, "key press list", kpl)
  520.                    
  521.             ds_list_add(data[?"prev runs"],ghost)
  522.             ds_list_mark_as_map(data[?"prev runs"], ds_list_size(data[?"prev runs"])-1)
  523.            
  524.            
  525.             ds_map_destroy(data[?"this run"])
  526.             ds_map_add_map(data, "this run", ds_map_create())
  527.             ds_map_add_list(data[?"this run"], "key press list", ds_list_create())
  528.             ds_map_set(data[?"this run"], "x", room_width/2)
  529.             ds_map_set(data[?"this run"], "y", room_height/2)
  530.             ds_map_set(data[?"this run"], "vspeed", 0)
  531.             ds_map_set(data[?"this run"], "number", ds_list_size(data[?"prev runs"])+1)
  532.            
  533.             //view_xview[0]=0
  534.            
  535.             //Skip some distance for ghosts
  536.             for(var n=0; n<ds_list_size(data[?"prev runs"]); n++) {
  537.                 var currentGhost=ds_list_find_value(data[?"prev runs"], n);
  538.  
  539.                 repeat((ds_list_size(data[?"prev runs"])+1-currentGhost[?"number"])*ghostDistance) {
  540.                     currentGhost[?"x"]+=hspd
  541.                     currentGhost[?"y"]+=currentGhost[?"vspeed"]
  542.                     currentGhost[?"y"]=clamp(currentGhost[?"y"],0-64,room_width+64)
  543.                     currentGhost[?"vspeed"]+=grav //Gravity
  544.  
  545.                     if(ds_exists(currentGhost[?"key press list"], ds_type_list) && ds_list_find_index(currentGhost[?"key press list"], currentGhost[?"live"])!=-1) {
  546.                         currentGhost[?"vspeed"]=-jumpPower
  547.                     }
  548.                    
  549.                     currentGhost[?"live"]++
  550.                 }
  551.             }
  552.            
  553.             //Move enemies
  554.             for(var n=0; n<ds_list_size(data[?"enemies"]); n++) {
  555.                 var currentEnemy=ds_list_find_value(data[?"enemies"], n);
  556.                 if(ds_map_exists(currentEnemy,"death")) {
  557.                     currentEnemy[?"death"]-=ghostDistance
  558.                 }
  559.             }
  560.            
  561.             data[?"game step"]=0
  562.            
  563.             var f=file_text_open_write("data.json");
  564.             file_text_write_string(f,json_encode(0));
  565.             file_text_close(f)        
  566.            
  567.             //show_debug_message(json_encode(data))            
  568.                
  569.             //Go to menu
  570.             if(keyboard_check_pressed(vk_escape)) {
  571.                 data[?"game state"]=gamestate.menu
  572.                 exit
  573.             }
  574.         }
  575.        
  576.         //"YOU DIED!" text
  577.         var _x=view_xview[0]+view_wview[0]*0.5;
  578.         var _y=view_yview[0]+view_hview[0]*0.4;
  579.         var _a=0;      
  580.         var s=data[?"surface text - you died"];
  581.         draw_surface(s, _x-surface_get_width(s)/2, _y-surface_get_height(s)/2)
  582.        
  583.         //"Press SPACE" text
  584.         var _x=view_xview[0]+view_wview[0]*0.5;
  585.         var _y=view_yview[0]+view_hview[0]*0.6;
  586.         var _a=0;
  587.         var s=data[?"surface text - PRESS SPACE"];
  588.         draw_surface(s, _x-surface_get_width(s)/2, _y-surface_get_height(s)/2)
  589.     }
  590.    
  591.     if(data[?"game state"]=gamestate.menu) {
  592.    
  593.         view_xview[0]=floor(lerp(view_xview[0], -view_wview[0], 0.1))
  594.    
  595.         //End game
  596.         if(keyboard_check_pressed(vk_escape)) {
  597.             game_end()
  598.             exit
  599.         }
  600.    
  601.         //On death reset game
  602.         if(keyboard_check_pressed(vk_space)) {
  603.             data[?"game step"]=0
  604.             data[?"game state"]=gamestate.play
  605.             exit
  606.         }
  607.        
  608.         //"FLAPPY SOULS" text
  609.         var _x=view_xview[0]+view_wview[0]*0.5;
  610.         var _y=view_yview[0]+view_hview[0]*0.25;
  611.         var _a=0;      
  612.         var s=data[?"surface text - FLAPPY SOULS"];
  613.         draw_surface(s, _x-surface_get_width(s)/2, _y-surface_get_height(s)/2)
  614.        
  615.         //"PRESS SPACE TO PLAY" text
  616.         var _x=view_xview[0]+view_wview[0]*0.5;
  617.         var _y=view_yview[0]+view_hview[0]*0.85;
  618.         var _a=0;
  619.         var s=data[?"surface text - PRESS SPACE TO PLAY"];
  620.         draw_surface(s, _x-surface_get_width(s)/2, _y-surface_get_height(s)/2)
  621.     }
  622. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement