]> vgcfreebox.myrthtech.pt Git - gm-duelo.git/commitdiff
player object
authorVGoncalo <vitor.goncalo.costa@gmail.com>
Thu, 2 Apr 2026 19:01:45 +0000 (20:01 +0100)
committerVGoncalo <vitor.goncalo.costa@gmail.com>
Thu, 2 Apr 2026 19:01:45 +0000 (20:01 +0100)
26 files changed:
objects/obj_player/Alarm_0.gml [new file with mode: 0644]
objects/obj_player/Alarm_1.gml [new file with mode: 0644]
objects/obj_player/Alarm_2.gml [new file with mode: 0644]
objects/obj_player/Alarm_3.gml [new file with mode: 0644]
objects/obj_player/Alarm_4.gml [new file with mode: 0644]
objects/obj_player/Alarm_5.gml [new file with mode: 0644]
objects/obj_player/Collision_obj_lava.gml [new file with mode: 0644]
objects/obj_player/Create_0.gml [new file with mode: 0644]
objects/obj_player/Draw_0.gml [new file with mode: 0644]
objects/obj_player/Draw_64.gml [new file with mode: 0644]
objects/obj_player/Other_10.gml [new file with mode: 0644]
objects/obj_player/Other_11.gml [new file with mode: 0644]
objects/obj_player/Other_12.gml [new file with mode: 0644]
objects/obj_player/Other_13.gml [new file with mode: 0644]
objects/obj_player/Other_14.gml [new file with mode: 0644]
objects/obj_player/Other_15.gml [new file with mode: 0644]
objects/obj_player/Other_16.gml [new file with mode: 0644]
objects/obj_player/Other_17.gml [new file with mode: 0644]
objects/obj_player/Other_18.gml [new file with mode: 0644]
objects/obj_player/Other_19.gml [new file with mode: 0644]
objects/obj_player/Other_20.gml [new file with mode: 0644]
objects/obj_player/Other_4.gml [new file with mode: 0644]
objects/obj_player/Other_63.gml [new file with mode: 0644]
objects/obj_player/Step_0.gml [new file with mode: 0644]
objects/obj_player/Step_1.gml [new file with mode: 0644]
objects/obj_player/obj_player.yy [new file with mode: 0644]

diff --git a/objects/obj_player/Alarm_0.gml b/objects/obj_player/Alarm_0.gml
new file mode 100644 (file)
index 0000000..c327e2e
--- /dev/null
@@ -0,0 +1,2 @@
+/// @description reset jump
+alarm[0] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Alarm_1.gml b/objects/obj_player/Alarm_1.gml
new file mode 100644 (file)
index 0000000..cbf4770
--- /dev/null
@@ -0,0 +1,2 @@
+/// @description melee attack reset
+alarm[1] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Alarm_2.gml b/objects/obj_player/Alarm_2.gml
new file mode 100644 (file)
index 0000000..a5ed013
--- /dev/null
@@ -0,0 +1,2 @@
+/// @description roll cooldown
+alarm[2] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Alarm_3.gml b/objects/obj_player/Alarm_3.gml
new file mode 100644 (file)
index 0000000..ec3abd7
--- /dev/null
@@ -0,0 +1,4 @@
+/// @description hit available reset 
+//image_alpha = 1;
+_hit_bk_val = 0;
+alarm[3] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Alarm_4.gml b/objects/obj_player/Alarm_4.gml
new file mode 100644 (file)
index 0000000..2cbcd1f
--- /dev/null
@@ -0,0 +1,12 @@
+/// @description respawn player
+var _spawn_pick = choose(obj_p1_spawn,obj_p2_spawn,obj_p3_spawn,obj_p4_spawn,obj_p5_spawn);
+x = _spawn_pick.x;
+y = _spawn_pick.y;
+
+_amount_of_bullets = _selected_char._amount_of_bullets;//30;
+_health = _selected_char._health;
+
+
+audio_play_sound(snd_copper_bell,10,false);
+_state = HERO.IDLE;
+alarm[4] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Alarm_5.gml b/objects/obj_player/Alarm_5.gml
new file mode 100644 (file)
index 0000000..1818d5f
--- /dev/null
@@ -0,0 +1,2 @@
+/// @description reset special
+alarm[5] = -1;
\ No newline at end of file
diff --git a/objects/obj_player/Collision_obj_lava.gml b/objects/obj_player/Collision_obj_lava.gml
new file mode 100644 (file)
index 0000000..c889589
--- /dev/null
@@ -0,0 +1,9 @@
+/// @description 
+_vsp = 0.1;
+_hsp = 0;
+_health = 0;
+_state = HERO.DEAD;
+
+effect_create_above(ef_smokeup,x,y+8,0,c_red);
+if(player_id == 0 and alarm[4] = -1){ obj_game_controller._player1_victories--; alarm[4] = 3*room_speed}
+if(player_id == 1 and alarm[4] = -1){ obj_game_controller._player2_victories--; alarm[4] = 3*room_speed}
\ No newline at end of file
diff --git a/objects/obj_player/Create_0.gml b/objects/obj_player/Create_0.gml
new file mode 100644 (file)
index 0000000..d2d2e00
--- /dev/null
@@ -0,0 +1,126 @@
+// player info
+_im_player = 0;
+_amount_of_games = 0;
+_amount_of_victories = 0;
+_amount_of_relics = 0;
+_amount_of_golden_eggs = 0;
+_amount_of_silver_nut = 0
+_amount_of_artpiece = 0;
+_amount_of_obsidians = 0;
+_my_score = 0;
+
+// user inputs
+_right = 0;
+_left = 0;
+_up = 0;
+_down = 0;
+_melee_atk = 0;
+_range_atk = 0;
+_evasion = 0;
+_special = 0;
+
+_game_state = GAME_STATES.WAITING;
+
+// character info
+_char_select_index = 0;
+_selected_char = noone;
+_name = "";
+_health = 1;
+_speed = 0;
+_jump = 0;
+_special_cd = 0;
+_my_bullet_type = "";
+_amount_of_bullets = 0;
+_roll_speed = 0;
+_grav = 0;
+_wall_drag = 0;
+_to_grab = false;
+_hsp = 0;
+_vsp = 0;
+
+_jump_timer = 0;
+_attack_timer = 0;
+_shoot_timer = 0;
+_shoot_dir = 0;
+_hit_cd        = 2*room_speed;
+_dead_cd = 3*room_speed;
+
+_my_spr_idle = "";
+_my_spr_run = "";
+_my_spr_crouch = "";
+_my_spr_jump = "";
+_my_spr_roll = "";
+_my_spr_hang = "";
+_my_spr_shoot = "";
+_my_spr_attack = "";
+_my_spr_special = "";
+_my_spr_hit = "";
+_my_spr_dead = "";
+
+_hit_blink = animcurve_get_channel(ac_combat, 0);
+_hit_bk_val = 0;
+_grounded = false;
+_state = HERO.IDLE;
+
+init_players();
+
+function submit_my_data(){     
+       if(player_name != "unknown"){
+               var _p_name = string_replace(player_name," ","");
+               var _file =_p_name+"-save.txt";
+               if(file_exists(_file)){
+                       file_delete(_file);
+               }
+               
+               if(player_id==0){
+                       var _p_vic = obj_game_controller._player1_victories;
+                       var _p_relic =  obj_game_controller._player1_total_relics;
+                       var _p_eggs =  obj_game_controller._player1_total_egg_relic;
+                       var _p_nuts =  obj_game_controller._player1_total_nut_relic;
+                       var _p_obs =  obj_game_controller._player1_total_obsidians;
+                       var _p_art =  obj_game_controller._player1_total_art;
+                       var _p_score = ceil( (_p_relic + 3 * (obj_game_controller._player1_victories) + 4 *(_p_eggs*_p_nuts*_p_obs*_p_art)) / 1 );//_amount_of_games + 3 * (obj_game_controller._player1_victories) + 4 *(_p_eggs*_p_nuts*_p_obs*_p_art);
+                       obj_game_controller._player1_score = _p_score;
+               }else if(player_id==1){
+                       var _p_vic = _amount_of_victories + obj_game_controller._player2_victories;
+                       var _p_relic = _amount_of_relics + obj_game_controller._player2_total_relics;
+                       var _p_eggs = _amount_of_golden_eggs + obj_game_controller._player2_total_egg_relic;
+                       var _p_nuts = _amount_of_silver_nut + obj_game_controller._player2_total_nut_relic;
+                       var _p_obs = _amount_of_obsidians + obj_game_controller._player2_total_obsidians;
+                       var _p_art = _amount_of_artpiece + obj_game_controller._player2_total_art;
+                       var _p_score = ceil( (_p_relic + 3 * (obj_game_controller._player2_victories) + 4 *(_p_eggs*_p_nuts*_p_obs*_p_art)) / 1 );//_amount_of_games + 3 * (obj_game_controller._player2_victories) + 4 *(_p_eggs*_p_nuts*_p_obs*_p_art);
+                       obj_game_controller._player2_score = _p_score;
+               }
+               self._my_score = _p_score;
+               var _player_data = {
+                       player_gx_name  : player_name,
+                       games                   : _amount_of_games + obj_game_controller._amount_of_duels_this_session,
+                       victories               : _p_vic,
+                       relics                  : _p_relic,
+                       golden_eggs             : _p_eggs,
+                       silver_nuts             : _p_nuts,
+                       obsidians               : _p_obs,
+                       artpiece                : _p_art,
+                       pscore                  : _p_score,
+               }
+       
+               var _string_pdata = json_stringify(_player_data);
+               var _new_file = file_text_open_write(_file);
+               file_text_write_string(_new_file, _string_pdata);
+               file_text_close(_new_file);
+       }
+}
+
+_to_clear_my_data = 0;
+function delete_my_data(){
+       var _file =player_name+"-save.txt";
+       if(file_exists(_file)){
+               file_delete(_file);
+       }
+       var _p_name = string_replace(player_name," ","");
+       var _file =_p_name+"-save.txt";
+       if(file_exists(_file)){
+               file_delete(_file);
+       }
+       game_restart();
+}
diff --git a/objects/obj_player/Draw_0.gml b/objects/obj_player/Draw_0.gml
new file mode 100644 (file)
index 0000000..f355cb9
--- /dev/null
@@ -0,0 +1,37 @@
+draw_self();
+
+var _rm_name = room_get_name(room);
+if(_rm_name == "rm_lounge" and _game_state != GAME_STATES.WAITING){
+       if player_id == 0 {
+               draw_sprite(spr_char_select,0,room_width/2-64+48*_char_select_index,2*room_height/3 +96);
+               draw_set_halign(fa_center);
+               draw_rectangle_color(96,192,256,368,c_gray,c_gray,c_gray,c_gray,0);
+               draw_text_color(176, 200, string(global._characters[_char_select_index]._name),c_blue,c_blue,c_blue,c_blue,1);
+               draw_text(176, 232, "health: "+string(global._characters[_char_select_index]._health));
+               draw_text(176, 264, "speed: "+string(global._characters[_char_select_index]._speed));
+               draw_text(176, 296, "bullets: "+string(global._characters[_char_select_index]._amount_of_bullets));
+               draw_text(176, 328, "weapon: "+string(global._characters[_char_select_index]._info));
+               
+       }
+       if player_id == 1 {
+               draw_sprite(spr_char_select,1,room_width/2-64+48*_char_select_index,2*room_height/3 +96);
+               draw_rectangle_color(room_width-96,192,room_width-256,368,c_gray,c_gray,c_gray,c_gray,0);
+               draw_text_colour(room_width-176, 200, string(global._characters[_char_select_index]._name),c_orange,c_orange,c_orange,c_orange,1);
+               draw_text(room_width-176, 232, "health: "+string(global._characters[_char_select_index]._health));
+               draw_text(room_width-176, 264, "speed: "+string(global._characters[_char_select_index]._speed));
+               draw_text(room_width-176, 296, "bullets: "+string(global._characters[_char_select_index]._amount_of_bullets));
+               draw_text(room_width-176, 328, "weapon: "+string(global._characters[_char_select_index]._info));
+       }
+       
+       
+}
+
+if(_state == HERO.SHOOT and image_index < 3 and _grounded){
+       /**/
+       var _x2 = lengthdir_x(32*image_xscale,_shoot_dir);
+       var _y2 = lengthdir_y(32*image_xscale,_shoot_dir);
+
+       // circle
+       if(image_xscale == -1){draw_circle_color((x-12)-_x2*image_xscale,y-8-_y2,2,c_red,c_red,0);}
+       if(image_xscale == 1){draw_circle_color((x+12*image_xscale)+_x2*image_xscale,y-8+_y2,2,c_red,c_red,0);}
+}
\ No newline at end of file
diff --git a/objects/obj_player/Draw_64.gml b/objects/obj_player/Draw_64.gml
new file mode 100644 (file)
index 0000000..7523a57
--- /dev/null
@@ -0,0 +1,95 @@
+var _mid_x = room_width/2;
+var _mid_y = room_height/3;
+
+switch(_game_state){
+       /*case GAME_STATES.WAITING:{
+               if !_p1_ready or !_p2_ready {
+                       draw_set_halign(fa_center);
+                       draw_text(_mid_x, _mid_y+64, _waiting_msg);
+                       //draw_sprite_stretched(spr_title,0,_mid_x-172, _mid_y-64,356,128);
+               }
+               if _p1_ready {
+                       draw_set_halign(fa_left);
+                       draw_text(8, 2, _player1_name+" - READY");      
+               }
+               if _p2_ready {
+                       draw_set_halign(fa_right);
+                       draw_text(room_width-8, 2, _player2_name+" - READY");
+               }
+               
+               // controls
+               draw_set_halign(fa_center);
+               draw_text(_mid_x, room_height-32, " Arrows to move, Z for melee attack, X for range attack, C for special");
+               
+               // player info
+               //draw_player_info();
+       break;}*/
+       
+       case GAME_STATES.HERO_SELECTION:{
+               if(player_id == 0){
+                       draw_set_halign(fa_left);
+                       if _selected_char == noone {
+                               draw_text(8, 2, player_name+" - Choosing...");  
+                       }else{;
+                               draw_text(8, 2, player_name+" - "+string(_selected_char._name));        
+                       }
+                       
+                       // player scores
+                       if(player_name != "unknown" ){
+                               draw_text(24, 32,"DuelsMade: "+string(_amount_of_games));
+                               draw_text(24, 64,"Victories: "+string(_amount_of_victories));
+                               draw_text(24, 96,"Relics   : "+string(_amount_of_relics));
+                               draw_text(24, 128,"Score    : "+string(_my_score));
+                       }else{
+                               draw_text(24, 32, "Login in to OperaGX");
+                       }
+               }else if(player_id == 1){
+                       draw_set_halign(fa_right);
+                       if _selected_char == noone {
+                               draw_text(room_width-8, 2, "...Choosing - "+player_name);
+                       }else{
+                               draw_text(room_width-8, 2, string(_selected_char._name) +" - "+player_name);    
+                       }
+                       
+                       //player scores
+                       if(player_name != "unknown" ){
+                               draw_text(room_width-42, 32,"DuelsMade: "+string(_amount_of_games));
+                               draw_text(room_width-42, 64,"Victories: "+string(_amount_of_victories));
+                               draw_text(room_width-42, 96,"Relics   : "+string(_amount_of_relics));
+                               draw_text(room_width-42, 128,"Score   : "+string(_my_score));
+                       }else{
+                               draw_text(room_width-32, 32, "Login in to OperaGX");
+                       }
+               }       
+       break;}
+               
+       case GAME_STATES.FIGHTING:{
+               var _top_y = 18;
+               if(player_id == 0){
+                       draw_set_alpha(0.5);
+                       draw_rectangle_color(4,4,32+string_length(_selected_char._name)*14+32,42,c_gray,c_gray,c_gray,c_gray,0);
+                       draw_set_alpha(1);
+                       draw_rectangle_color(4,4,32+string_length(_selected_char._name)*14+32,42,c_blue,c_blue,c_blue,c_blue,1);
+                       draw_set_halign(fa_left);
+                       draw_text(8, 2, "P1 - "+_selected_char._name+" ("+string( obj_game_controller._player1_victories)+")");
+               
+                       for(var _hp1 = 0; _hp1 < _health; _hp1++){
+                               draw_sprite(spr_coracao,0,32+_hp1*16,32);
+                       }
+               }
+               
+               if(player_id == 1){
+                       draw_set_alpha(0.5);
+                       draw_rectangle_color(room_width-8, 4,room_width-(36+string_length(_selected_char._name)*14+32),42,c_gray,c_gray,c_gray,c_gray,0);
+                       draw_set_alpha(1);
+                       draw_rectangle_color(room_width-8, 4,room_width-(36+string_length(_selected_char._name)*14+32),42,c_orange,c_orange,c_orange,c_orange,1);
+                       draw_set_halign(fa_right);
+                       draw_text(room_width-8, 2, "P2 - "+_selected_char._name+" ("+string( obj_game_controller._player2_victories)+")");
+               
+                       for(var _hp2 = 0; _hp2 < _health; _hp2++){
+                               draw_sprite(spr_coracao,0,room_width-32-_hp2*16,32);
+                       }
+               }
+               
+       break;}
+}
diff --git a/objects/obj_player/Other_10.gml b/objects/obj_player/Other_10.gml
new file mode 100644 (file)
index 0000000..3bd833a
--- /dev/null
@@ -0,0 +1,53 @@
+/// @description IDLE
+sprite_index = asset_get_index(_my_spr_idle);
+image_speed = 1;
+_hsp = 0;
+
+if(_grounded){
+       if((_right!=0 or _left!=0)){
+               _state = HERO.MOVE;
+       }
+       
+       if(_up and alarm[0]=-1 ){
+               _state = HERO.JUMP;
+               _vsp = _jump;
+               audio_play_sound(snd_jump,10,false);
+               part_particles_burst(global._ps_jump_ef,x,y+sprite_height/2,ps_jump_ef);
+               alarm[0] = _jump_timer;
+       }
+       
+       if(_down){
+               _state = HERO.CROUCH;
+       }
+}else{
+       _hsp = (_right - _left);
+       if( place_meeting(x+sign(_hsp),y,obj_wall) ){
+               _state = HERO.WALL;
+       }
+       
+       // allow jump near wall
+       if(_up and ( place_meeting(x+sprite_width/2,y,obj_wall) or place_meeting(x-sprite_width/2,y,obj_wall) )){
+               _state = HERO.JUMP;
+               _vsp = _jump;
+               part_particles_burst(global._ps_jump_ef,x,y+sprite_height/2,ps_jump_ef);
+               alarm[0] = _jump_timer;
+       }
+       
+}
+
+if(_melee_atk and alarm[1] = -1){
+       image_index = 0;
+       alarm[1] = _attack_timer;
+       _state = HERO.ATTACK;
+}
+
+if(_evasion and alarm[5] = -1){
+       image_index = 0;
+       alarm[5] = _special_cd;
+       _state = HERO.EVASION;
+}
+
+if(_range_atk and not _melee_atk){
+       image_index = 0;
+       _state = HERO.SHOOT;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_11.gml b/objects/obj_player/Other_11.gml
new file mode 100644 (file)
index 0000000..b7dcaf5
--- /dev/null
@@ -0,0 +1,33 @@
+/// @description RUN
+sprite_index =  asset_get_index(string(_my_spr_run));
+image_speed = 1;
+_hsp = (_right - _left) * _speed;
+
+if(_grounded){ 
+       part_particles_burst(global._ps_walk_ef,x,y+sprite_height/2,ps_walk_ef);
+       if(_right = 0 and _left = 0){
+               _state = HERO.IDLE;
+       }
+       
+       if(_up and alarm[0]=-1){
+               _state = HERO.JUMP;
+               _vsp = _jump;
+               audio_play_sound(snd_jump,10,false);
+               part_particles_burst(global._ps_jump_ef,x,y+sprite_height/2,ps_jump_ef);
+               alarm[0] = _jump_timer;
+       }
+       
+       if(_down){
+               _state = HERO.CROUCH;
+       }
+}else{ 
+       if( place_meeting(x+sign(_hsp),y,obj_wall) ){
+               _state = HERO.WALL;
+       }
+}
+
+if(_melee_atk and alarm[1] = -1){
+       image_index = 0;
+       alarm[1] = _attack_timer;
+       _state = HERO.ATTACK;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_12.gml b/objects/obj_player/Other_12.gml
new file mode 100644 (file)
index 0000000..004c08a
--- /dev/null
@@ -0,0 +1,26 @@
+/// @description JUMP
+sprite_index =  asset_get_index(string(_my_spr_jump));
+_hsp = (_right - _left) * _speed;
+if(image_index > 2){
+       image_speed = 0;
+}
+
+if(_hsp!=0 and place_meeting(x+_hsp,y,obj_wall)){
+       //image_index = 0;
+       _state = HERO.WALL;
+}
+
+if(_vsp = 0 and place_meeting(x,y+sprite_get_bbox_bottom(sprite_index),obj_wall)){
+       _state = HERO.IDLE;
+}
+
+if(_melee_atk and alarm[1] = -1){
+       image_index = 0;
+       alarm[1] = 2 * _attack_timer;
+       _state = HERO.ATTACK;
+}
+
+if(_range_atk){
+       image_index = 0;
+       _state = HERO.SHOOT;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_13.gml b/objects/obj_player/Other_13.gml
new file mode 100644 (file)
index 0000000..3e72b34
--- /dev/null
@@ -0,0 +1,78 @@
+/// @description ATTACK
+sprite_index =  asset_get_index(string(_my_spr_attack));
+image_speed = 1;
+_hsp = sign(_hsp);
+
+if(image_index < 1){
+       audio_play_sound(snd_melee_attack,10,false);
+}
+
+// samurai style - model attack 4
+if(sprite_index == spr_samurai_attack or sprite_index == spr_model_attack_4){
+       if(image_index > 0 and image_index < 9){
+               var _to_hit = collision_point(x+24*image_xscale,y,obj_player,true,true);
+               if(_to_hit){
+                       if(_to_hit._state == HERO.ATTACK){
+                               audio_play_sound(snd_sword_hit_sword,10,false);
+                               var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                               _hsp = -image_xscale * 15;
+                               _vsp = -10;
+                       }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                       _to_hit._state = HERO.HIT;
+                       }
+               }
+               if(image_index > 5 and image_index < 6){audio_play_sound(snd_melee_attack,10,false);}
+       }
+
+       if(image_index > 8){
+               _state = HERO.IDLE;
+       }
+       if(image_index > 3 and _melee_atk = 0){
+               _state = HERO.IDLE;
+       }
+}
+
+// sabre style
+if(sprite_index == spr_pirate_attack or sprite_index = spr_alentejano_attack){
+       if(image_index > 1 and image_index < 4){
+               var _to_hit = collision_point(x+16*image_xscale,y,obj_player,true,true);
+               if(_to_hit){
+                       if(_to_hit._state == HERO.ATTACK){
+                               audio_play_sound(snd_sword_hit_sword,10,false);
+                               var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                               _hsp = -image_xscale * 15;
+                               _vsp = -10;
+                       }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                       _to_hit._state = HERO.HIT;
+                       }
+               }
+       }
+       
+       if(image_index > 5){
+               _state = HERO.IDLE;
+       }
+}
+
+// jab style
+if(sprite_index == spr_model_jab){
+       if(image_index > 0 and image_index < 8){
+               var _to_hit = collision_point(x+8*image_xscale,y,obj_player,true,true);
+               if(_to_hit){
+                       if(_to_hit._state == HERO.ATTACK){
+                               var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                               _hsp = -image_xscale * 15;
+                               _vsp = -10;
+                       }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                               _to_hit._state = HERO.HIT;
+                               //_to_hit._health += 0.5;
+                       }
+               }
+       }
+       
+       /*if(image_index > 8 and _evasion){
+               sprite_index = spr_model_punch;
+               _state = HERO.ATTACK;*/
+       if(image_index > 9){
+               _state = HERO.IDLE;
+       }
+}
diff --git a/objects/obj_player/Other_14.gml b/objects/obj_player/Other_14.gml
new file mode 100644 (file)
index 0000000..d8f1e3a
--- /dev/null
@@ -0,0 +1,49 @@
+/// @description WALL HANG / CLIMB
+sprite_index =  asset_get_index(string(_my_spr_hang));
+image_speed = 0;
+_grounded = false;
+
+if(_right or _left){
+       _hsp=0;
+       
+       //!place_meeting(x+6*image_xscale,y-14,obj_wall)
+       var _wall = collision_point(x+12*image_xscale,y-14,obj_wall,false,1);
+       if( _wall and not(_to_grab)){
+               if(_selected_char._name == "Casimiro"){
+                       _wall_drag = 0;
+               }else{
+                       //effect_create_below(ef_smokeup,x+14*image_xscale,y+4,0,c_grey);
+                       part_particles_burst(global._ps_walk_ef,x+14*image_xscale,y-8,ps_walk_ef);
+                       _wall_drag = 0.3;
+               }
+       }else if(_wall and _to_grab){
+               _wall_drag = 0;
+               //image_speed = 1;
+       }else{
+               _wall_drag = 2;
+               _to_grab = true;
+       }
+       
+}else{
+       _to_grab = false;
+       _state = HERO.IDLE;
+}
+
+if(place_meeting(x,y+_vsp,obj_wall)){
+       _to_grab = false;
+       _state = HERO.IDLE;
+}
+
+if(_up and alarm[0]=-1){
+       audio_play_sound(snd_jump,10,false);
+       _to_grab = false;
+       _state = HERO.JUMP;
+       _vsp = _jump;//+_jump/5;
+       _hsp = 3*image_xscale*_jump;
+       alarm[0] = _jump_timer;
+}
+
+if(!place_meeting(x+6*image_xscale,y+1,obj_wall)){
+       _to_grab = false;
+       _state = HERO.IDLE;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_15.gml b/objects/obj_player/Other_15.gml
new file mode 100644 (file)
index 0000000..e8e5f71
--- /dev/null
@@ -0,0 +1,13 @@
+/// @description CROUCH
+sprite_index =  asset_get_index(string(_my_spr_crouch));
+image_speed = 1;
+
+if(_down){
+       if((_right or _left) and alarm[2] = -1){
+               image_index = 0;
+               _state = HERO.ROLL;
+               alarm[2] = room_speed/2;
+       }
+}else{
+       _state = HERO.IDLE;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_16.gml b/objects/obj_player/Other_16.gml
new file mode 100644 (file)
index 0000000..b27e83a
--- /dev/null
@@ -0,0 +1,72 @@
+/// @description SHOOT
+sprite_index =  asset_get_index(string(_my_spr_shoot));
+_hsp = 0;
+
+if(_range_atk and image_index < 1){
+       // point direction
+       image_speed = 0;
+       if(_grounded){
+               if(_up){_shoot_dir+=2;}
+               else if(_down){_shoot_dir-=2}
+               else{
+                       if(_shoot_dir > 0){_shoot_dir-=1;}
+                       if(_shoot_dir < 0){_shoot_dir+=1;}
+               }
+                       if(_shoot_dir > 90){_shoot_dir=90;}
+                       if(_shoot_dir < -75){_shoot_dir=-75;}
+       }
+
+
+       if(_melee_atk){
+               image_speed = 1;
+               image_index = 5;        
+       }
+}else{
+       image_speed = 1;
+       if(image_index < 0.4){
+               if(_amount_of_bullets > 0 ){
+                       if(_my_bullet_type == "obj_bullet"){
+                               audio_play_sound(snd_glock_shoot,10,false);
+                       }else if(_my_bullet_type == "obj_kunai"){
+                               audio_play_sound(snd_throw,10,false);
+                       }
+                       
+                       //audio_play_sound_ext(global._pistol_snd);
+                       if(not(_grounded)){     
+                               var _blt_dir;
+                               var _blt_x = 12*image_xscale;
+                               var _blt_y = 8;
+                               if(_up){
+                                       if _right  _blt_dir = 45;
+                                       else if _left   _blt_dir = 135;
+                                       else  _blt_dir = 90; _blt_x = 0; _blt_y = 14;
+                               }else if(_down){
+                                       if _right  _blt_dir = 315;
+                                       else if _left   _blt_dir = 225;
+                                       else  _blt_dir = 270; _blt_x = 0; _blt_y = -14;
+                               }else{
+                                       if image_xscale = 1  _blt_dir = 0
+                                       if image_xscale = -1 _blt_dir = 180;
+                               }
+                       
+                               var _my_bullet = instance_create_layer(x + _blt_x, y - _blt_y, "Instances", asset_get_index(string(_my_bullet_type)), {direction : _blt_dir});
+                               _amount_of_bullets--;
+                       }
+                       // aim shoot
+                       if(_grounded){
+                               var _blt_x = 12*image_xscale;
+                               var _blt_y = 8;
+                               if(image_xscale == -1){_shoot_dir = 180 - _shoot_dir}
+                               var _my_bullet = instance_create_layer(x + _blt_x, y - _blt_y, "Instances", asset_get_index(string(_my_bullet_type)), {direction : _shoot_dir});
+                               _amount_of_bullets--;
+                       }
+               }else{
+                       //audio_play_sound(snd_empty_gun,10,false);
+               }
+       }
+       if(image_index > 9){
+               _state = HERO.IDLE;
+               _shoot_dir = 0;
+       }
+       if(!_grounded){_state = HERO.JUMP;image_index = 1;_shoot_dir = 0;}
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_17.gml b/objects/obj_player/Other_17.gml
new file mode 100644 (file)
index 0000000..07ee30d
--- /dev/null
@@ -0,0 +1,19 @@
+/// @description HIT
+image_speed = 1;
+_shoot_dir = 0;
+
+if(alarm[3] = -1){
+       audio_play_sound(choose(snd_cut_01,snd_cut_02),10,false);
+       part_particles_burst(global._ps_blood,x,y,ps_blood);
+       _health--;
+       alarm[3] = _hit_cd;
+       
+       sprite_index =  asset_get_index(string(_my_spr_hit));
+       image_index = 0;
+       part_particles_burst(global._ps_blood,x,y,ps_blood);
+}
+if(image_index > 3){
+       if(_health > 0){
+               _state = HERO.IDLE;
+       }else{_state = HERO.DEAD; alarm[3] = -1;}
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_18.gml b/objects/obj_player/Other_18.gml
new file mode 100644 (file)
index 0000000..0bbca9f
--- /dev/null
@@ -0,0 +1,19 @@
+/// @description DEAD
+sprite_index =  asset_get_index(string(_my_spr_dead));
+_hsp = 0;
+
+if(image_index > 9){
+       image_speed = 0;
+       if(alarm[4] = -1){
+               if(player_id == 0){ obj_game_controller._player2_victories++; }
+               if(player_id == 1){ obj_game_controller._player1_victories++; }
+               obj_game_controller._amount_of_duels_this_session++;
+               obj_game_controller._relics_spawn++;
+               
+               with(obj_player){       submit_my_data();       }
+               obj_gmscoreboard._update_scores = true;
+               alarm[4] = _dead_cd;
+       }
+}else{
+       part_particles_burst(global._ps_blood,x,y,ps_blood);
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_19.gml b/objects/obj_player/Other_19.gml
new file mode 100644 (file)
index 0000000..b61c6f0
--- /dev/null
@@ -0,0 +1,9 @@
+/// @description ROLL
+sprite_index =  asset_get_index(string(_my_spr_roll));
+image_speed = 1;
+_hsp = _roll_speed * image_xscale;
+
+if(image_index > 6){
+       _hsp = 0;
+       _state = HERO.IDLE;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_20.gml b/objects/obj_player/Other_20.gml
new file mode 100644 (file)
index 0000000..17066ca
--- /dev/null
@@ -0,0 +1,79 @@
+/// @description EVASION C
+sprite_index =  asset_get_index(string(_my_spr_special));
+if sprite_index != "tbd" { 
+       image_speed = 1;
+       _hsp = sign(_hsp);
+       
+       if(image_index < 1){
+               audio_play_sound(snd_melee_sword_attack,10,false);
+       }
+
+       // punch style
+       if(sprite_index == spr_model_punch or sprite_index == spr_alentejano_punch){
+               if(image_index > 4 and image_index < 7){
+                       var _to_hit = collision_point(x+18*image_xscale,y,obj_player,true,true);
+                       if(_to_hit){
+                               if(_to_hit._state == HERO.ATTACK){
+                                       var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                                       _to_hit._hsp = -image_xscale * 10;
+                                       _to_hit._vsp = -5;
+                               }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                                       _to_hit._state = HERO.HIT;
+                                       _to_hit._hsp = -_to_hit.image_xscale * 8;
+                                       _to_hit._vsp = -4;
+                               }
+                       }
+               }
+       
+               if(image_index > 7){
+                       _state = HERO.IDLE;
+               }
+       }
+
+       // samurai style - model attack 3
+       if(sprite_index == spr_samurai_attack_2){
+               if(image_index > 1 and image_index < 10){
+                       var _to_hit = collision_point(x+30*image_xscale,y,obj_player,true,true);
+                       if(_to_hit){
+                               if(_to_hit._state == HERO.ATTACK){
+                                       audio_play_sound(snd_sword_w_sword_00,10,false);
+                                       var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                                       _hsp = -image_xscale * 15;
+                                       _vsp = -10;
+                               }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                                       _to_hit._state = HERO.HIT;
+                                       _to_hit._health = 0;
+                                       part_particles_burst(global._ps_blood,_to_hit.x,_to_hit.y,ps_blood);
+                               }
+                       }
+               }
+
+               if(image_index > 15){
+                       _state = HERO.IDLE;
+               }
+       }
+       
+       // stab style
+       if(sprite_index == spr_model_attack_2  or sprite_index == spr_pirate_hook_atk){
+               if(image_index > 1 and image_index < 5){
+                       var _to_hit = collision_point(x+20*image_xscale,y,obj_player,true,true);
+                       if(_to_hit){
+                               if(_to_hit._state == HERO.ATTACK){
+                                       var _efx = choose(effect_create_above(ef_ring,x,y,0,c_white), effect_create_above(ef_ellipse,x,y,0,c_white) );
+                                       _hsp = -image_xscale * 15;
+                                       _vsp = -10;
+                               }else if(_to_hit._state != HERO.HIT and _to_hit._state != HERO.DEAD and _to_hit._state != HERO.ROLL){
+                                       _to_hit._state = HERO.HIT;
+                                       _to_hit._health--;
+                               }
+                       }
+               }
+       
+               if(image_index > 6){
+                       _state = HERO.IDLE;
+               }
+       }
+       
+}else{
+       _state = HERO.IDLE;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_4.gml b/objects/obj_player/Other_4.gml
new file mode 100644 (file)
index 0000000..b242de1
--- /dev/null
@@ -0,0 +1,5 @@
+/// @description spawn heros
+var _rm_name = room_get_name(room);
+if(_rm_name != "rm_lounge"){
+       init_character_spawn();
+}
\ No newline at end of file
diff --git a/objects/obj_player/Other_63.gml b/objects/obj_player/Other_63.gml
new file mode 100644 (file)
index 0000000..5fa1dbc
--- /dev/null
@@ -0,0 +1,8 @@
+var _i_d = ds_map_find_value(async_load, "id");
+if (_i_d == _to_clear_my_data){
+    if (ds_map_find_value(async_load, "status")){
+        if (ds_map_find_value(async_load, "result") == "YES"){
+                       delete_my_data();
+        }
+    }
+}
\ No newline at end of file
diff --git a/objects/obj_player/Step_0.gml b/objects/obj_player/Step_0.gml
new file mode 100644 (file)
index 0000000..088746a
--- /dev/null
@@ -0,0 +1,93 @@
+if(_game_state = GAME_STATES.WAITING){
+       if(object_exists(obj_game_controller)){
+               if(_up or _down or _left or _right or _melee_atk or _range_atk){
+                       if player_id == 0 obj_game_controller._p1_ready = true;
+                       if player_id == 1 obj_game_controller._p2_ready = true;
+               }
+       }
+}
+
+if(_game_state = GAME_STATES.HERO_SELECTION){
+       var _max_char = array_length(global._characters)-1;
+       if(_right and alarm[0] = -1 and _selected_char == noone){_char_select_index++; alarm[0] = room_speed/4}
+       if(_left and alarm[0] = -1 and _selected_char == noone){_char_select_index--; alarm[0] = room_speed/4}
+       if(player_id == 0){ // for debug
+               if(_up and alarm[0] = -1){obj_game_controller._scenary_selected_index++; alarm[0] = room_speed/4}
+               if(_down and alarm[0] = -1){obj_game_controller._scenary_selected_index--; alarm[0] = room_speed/4}
+       }
+       if _char_select_index < 0 _char_select_index = _max_char;
+       if _char_select_index > _max_char _char_select_index = 0;
+       
+       if _melee_atk and player_id == 0 {
+               _selected_char = global._characters[_char_select_index];
+               obj_game_controller._p1_selected_char = _selected_char;
+               fetch_my_attr(_selected_char);
+       }else if _melee_atk and player_id == 1 {
+               _selected_char = global._characters[_char_select_index];
+               obj_game_controller._p2_selected_char = _selected_char;
+               fetch_my_attr(_selected_char); // to remove
+       }
+       if(_range_atk and _selected_char != noone){
+               _selected_char = noone;
+               if player_id == 0 obj_game_controller._p1_selected_char = noone;
+               if player_id == 1 obj_game_controller._p2_selected_char = noone;
+       }
+       if( _special and player_id == 0 ){
+               _to_clear_my_data = get_string_async("Writte YES to clear your data","NO");
+       }
+}
+
+if(_game_state = GAME_STATES.FIGHTING){
+       if _health <= 0 _state = HERO.DEAD;
+       if player_id == 0 obj_game_controller._p1_hp = _health;
+       if player_id == 1 obj_game_controller._p2_hp = _health;
+       
+       switch(_state){
+               case HERO.IDLE:
+                       event_user(_state);
+               break;
+               case HERO.MOVE:
+                       event_user(_state);
+               break;
+               case HERO.JUMP:
+                       event_user(_state);
+               break;
+               case HERO.ATTACK:
+                       event_user(_state);
+               break;
+               case HERO.WALL:
+                       event_user(_state);
+               break;
+               case HERO.CROUCH:
+                       event_user(_state);
+               break;
+               case HERO.SHOOT:
+                       event_user(_state);
+               break;
+               case HERO.HIT:
+                       event_user(_state);
+               break;
+               case HERO.DEAD:
+                       event_user(_state);
+               break;
+               case HERO.ROLL:
+                       event_user(_state);
+               break;
+               case HERO.EVASION:
+                       event_user(_state);
+               break;
+       }
+
+       if _state != HERO.WALL _vsp += _grav; else _vsp = _wall_drag;
+       obj_wall_collisions();
+
+       // hit blink
+       if(alarm[3] != -1){
+               var _val = animcurve_channel_evaluate(_hit_blink, _hit_bk_val);
+               image_alpha = _val;
+               if _hit_bk_val > 1 _hit_bk_val = 0;else _hit_bk_val+=0.1;
+       }else{image_alpha = 1;}
+
+       x += _hsp;
+       y += _vsp;
+}
\ No newline at end of file
diff --git a/objects/obj_player/Step_1.gml b/objects/obj_player/Step_1.gml
new file mode 100644 (file)
index 0000000..f9c48e0
--- /dev/null
@@ -0,0 +1,39 @@
+/// @description check user inputs
+var _input = rollback_get_input();
+
+//keyboard inputs
+// movement
+if(_input.right){
+       _right = 1;  
+}else{ _right = 0;}
+if(_input.left){
+       _left = 1;  
+}else{ _left = 0;}
+if(_input.up){
+       _up = 1;  
+}else{ _up = 0;}
+if(_input.down){
+       _down = 1;  
+}else{ _down = 0;}
+
+// action
+if(_input.z and not _input.x){
+       _melee_atk = 1;
+}else{ _melee_atk = 0;}
+if(_input.x and not _input.z){
+       _range_atk = 1;
+}else{ _range_atk = 0;}
+if(_input.c){
+       _evasion = 1;  
+}else{ _evasion = 0;}
+
+if(_input.space){
+       _special = 1;  
+}else{ _special = 0;}
+
+
+// face direction
+if(_state != HERO.DEAD){
+       if _left = 1 image_xscale = -1;
+       if _right = 1 image_xscale = 1;
+}
\ No newline at end of file
diff --git a/objects/obj_player/obj_player.yy b/objects/obj_player/obj_player.yy
new file mode 100644 (file)
index 0000000..0660edf
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "$GMObject":"",
+  "%Name":"obj_player",
+  "eventList":[
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":10,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":11,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":12,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":13,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":14,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":15,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":16,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":17,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":18,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":19,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":2,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":3,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":4,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":4,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":{"name":"obj_lava","path":"objects/obj_lava/obj_lava.yy",},"eventNum":0,"eventType":4,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":20,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":5,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":63,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+  ],
+  "managed":true,
+  "name":"obj_player",
+  "overriddenProperties":[],
+  "parent":{
+    "name":"players",
+    "path":"folders/Objects/players.yy",
+  },
+  "parentObjectId":null,
+  "persistent":true,
+  "physicsAngularDamping":0.1,
+  "physicsDensity":0.5,
+  "physicsFriction":0.2,
+  "physicsGroup":1,
+  "physicsKinematic":false,
+  "physicsLinearDamping":0.1,
+  "physicsObject":false,
+  "physicsRestitution":0.1,
+  "physicsSensor":false,
+  "physicsShape":1,
+  "physicsShapePoints":[],
+  "physicsStartAwake":true,
+  "properties":[],
+  "resourceType":"GMObject",
+  "resourceVersion":"2.0",
+  "solid":false,
+  "spriteId":null,
+  "spriteMaskId":null,
+  "visible":true,
+}
\ No newline at end of file