--- /dev/null
+/// @description reset jump
+alarm[0] = -1;
\ No newline at end of file
--- /dev/null
+/// @description melee attack reset
+alarm[1] = -1;
\ No newline at end of file
--- /dev/null
+/// @description roll cooldown
+alarm[2] = -1;
\ No newline at end of file
--- /dev/null
+/// @description hit available reset
+//image_alpha = 1;
+_hit_bk_val = 0;
+alarm[3] = -1;
\ No newline at end of file
--- /dev/null
+/// @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
--- /dev/null
+/// @description reset special
+alarm[5] = -1;
\ No newline at end of file
--- /dev/null
+/// @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
--- /dev/null
+// 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();
+}
--- /dev/null
+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
--- /dev/null
+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;}
+}
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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;
+ }
+}
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @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
--- /dev/null
+/// @description spawn heros
+var _rm_name = room_get_name(room);
+if(_rm_name != "rm_lounge"){
+ init_character_spawn();
+}
\ No newline at end of file
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+/// @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
--- /dev/null
+{
+ "$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