--- /dev/null
+rollback_define_player(obj_player,"Instances");
+if(not(rollback_join_game())){
+ rollback_create_game(2,true);
+}
\ No newline at end of file
--- /dev/null
+{
+ "$GMObject":"",
+ "%Name":"obj_game",
+ "eventList":[
+ {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+ ],
+ "managed":true,
+ "name":"obj_game",
+ "overriddenProperties":[],
+ "parent":{
+ "name":"Objects",
+ "path":"folders/Objects.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
--- /dev/null
+/// @description players ready, go to char select
+_state = GAME_STATES.HERO_SELECTION;
+obj_player._game_state = GAME_STATES.HERO_SELECTION;
+alarm[0] = -1;
\ No newline at end of file
--- /dev/null
+alarm[1] = -1;
\ No newline at end of file
--- /dev/null
+/// @description spawn silver nut
+var _nut_xy = choose([125,182],[380,325],[355,36],[920,100],[720,196]);
+instance_create_layer(_nut_xy[0], _nut_xy[1],"Instances",obj_silver_nut);
+_relics_spawn = 0;
+alarm[2] = -1;
\ No newline at end of file
--- /dev/null
+/// @description character and scenary selected
+if(_p1_selected_char != noone and _p2_selected_char != noone){
+ _state = GAME_STATES.FIGHTING;
+ obj_player._game_state = GAME_STATES.FIGHTING;
+
+ room_goto(_scenary_selected._index);
+ alarm[3] = -1;
+}else{alarm[3] = 180;}
--- /dev/null
+// Game SESSION DATA
+_player1_name = "";
+_player1_instid = 0;
+_p1_ready = false;
+_player1_total_games = 0;
+_player1_total_victories = 0;
+_player1_total_relics = 0;
+_player1_total_egg_relic = 0;
+_player1_total_nut_relic = 0;
+_player1_total_obsidians = 0;
+_player1_total_art = 0;
+_player1_score = 0;
+
+_player2_name = "";
+_player2_instid = 0;
+_p2_ready = false;
+_player2_total_games = 0;
+_player2_total_victories = 0;
+_player2_total_relics = 0;
+_player2_total_egg_relic = 0;
+_player2_total_nut_relic = 0;
+_player2_total_obsidians = 0;
+_player2_total_art = 0;
+_player2_score = 0;
+
+// current session
+_time_in_game = 0;
+_amount_of_duels_this_session = 0;
+_sync_save_player_data = 0;
+
+_player1_victories = 0;
+_player1_relics = 0;
+_player1_egg_relic = 0;
+_player1_nut_relic = 0;
+_player1_obsidian_relic = 0;
+_player1_art_relic = 0;
+
+_player2_victories = 0;
+_player2_relics = 0;
+_player2_egg_relic = 0;
+_player2_nut_relic = 0;
+_player2_obsidian_relic = 0;
+_player2_art_relic = 0;
+_relics_spawn = 0;
+
+
+_available_chars = global._characters;
+_p1_selected_char = noone;
+_p2_selected_char = noone;
+_p1_hp = 0;
+_p2_hp = 0;
+
+
+_scenary_available = global._levels;
+_scenary_selected_index = 0;
+_scenary_selected_max = array_length(_scenary_available)-1;
+_scenary_selected = _scenary_available[_scenary_selected_index];
+
+_state = GAME_STATES.WAITING;
+
+_waiting_msg = " Waiting for Players ";
+_waiting_msg2 = " Login to OperaGX for Score Submission ";
+
+
+
+alarm[0] = -1; // players gave input
+//alarm[1] = -1; // scoreboard rest function :P
+alarm[2] = -1; // respawn silver nut delay
+alarm[3] = -1; // go fight after character selection
--- /dev/null
+var _mid_x = room_width/2;
+var _mid_y = room_height/3;
+
+switch(_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);
+ }
+ 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, "READY - "+_player2_name);
+ }
+
+ // 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");
+ break;}
+
+ case GAME_STATES.HERO_SELECTION:{
+ //Arena Display
+ draw_set_halign(fa_center);
+ draw_sprite_stretched(asset_get_index(_scenary_selected._cover), 0, _mid_x-192, _mid_y-88, 384, 288);
+ draw_text(_mid_x, _mid_y+212,_scenary_selected._title);
+ var _rm_title_lgh = string_length(_scenary_selected._title);
+ draw_sprite(spr_menu_arrow_small,1,_mid_x - _rm_title_lgh*6, _mid_y+222);
+ draw_sprite(spr_menu_arrow_small,3,_mid_x + _rm_title_lgh*6, _mid_y+222);
+
+ // portrait display
+ draw_set_halign(fa_center);
+ for(var _i = 0; _i < array_length(global._characters); _i++){
+ var _portrait = global._characters[_i]._portrait;
+ var _pt_icon = asset_get_index(string(_portrait));
+ draw_sprite_stretched(_pt_icon,0,room_width/2-96+48*_i,2*room_height/3+64,64,64);
+
+ if _i == 0 draw_sprite(spr_menu_arrow,2,room_width/2-96-24,2*room_height/3+96);
+ if _i == array_length(global._characters)-1 draw_sprite(spr_menu_arrow,0,room_width/2+48*_i-8,2*room_height/3+96);
+ }
+
+ // attributes display
+ draw_rectangle_color(96,192,256,368,c_blue,c_blue,c_blue,c_blue,1);
+ draw_rectangle_color(room_width-96,192,room_width-256,368,c_orange,c_orange,c_orange,c_orange,1);
+
+ // 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");
+ break;}
+
+ case GAME_STATES.FIGHTING:{
+ var _top_y = 18;
+ draw_set_halign(fa_center);
+ draw_set_alpha(0.5);
+ draw_rectangle_color(_mid_x-30,4,_mid_x+32,40,c_gray,c_gray,c_gray,c_gray,0);
+ draw_set_alpha(1);
+ draw_text(_mid_x, 1, "Round");
+ draw_text(_mid_x+4, _top_y, _amount_of_duels_this_session);
+ break;}
+}
--- /dev/null
+/// @description WAITING
+if(_player1_instid != 0 and _player2_instid != 0 and _p1_ready and _p2_ready and alarm[0] = -1){
+ alarm[0] = 1.5*room_speed;
+ obj_title._animate = true;
+}
+if(_player1_instid != 0 and _player2_instid != 0 ){
+ _waiting_msg = " Press any key "
+}
--- /dev/null
+/// @description HERO SELECTION
+if(_p1_selected_char != noone and _p2_selected_char != noone and _scenary_selected != noone and alarm[3] = -1){
+ alarm[3] = 2*room_speed;
+ audio_play_sound(snd_two_bells,10,false);
+}
+
+if _scenary_selected_index > _scenary_selected_max _scenary_selected_index = 0;
+if _scenary_selected_index < 0 _scenary_selected_index = _scenary_selected_max;
+_scenary_selected = _scenary_available[_scenary_selected_index];
\ No newline at end of file
--- /dev/null
+/// @description FIGHTING
+if _player1_victories < 0 _player1_victories = 0;
+if _player2_victories < 0 _player2_victories = 0;
+
+
+
+// spawn relics
+var _rm_name = room_get_name(room);
+if(_rm_name == "rm_the_mountain" ){
+ if(_relics_spawn > 3 and !instance_exists(obj_bird)){
+ instance_create_layer(obj_nest.x-256,obj_nest.y-156,"Instances",obj_bird);
+ _relics_spawn = 0;
+ }
+ if _relics_spawn > 2 and instance_exists(obj_bird) _relics_spawn = 0;
+}
+
+if(_rm_name == "rm_the_forest" ){
+ if(_relics_spawn > 2 and alarm[2] = -1){
+ alarm[2] = room_speed * 3;
+ }
+}
+
+if(_rm_name == "rm_the_volcano" ){
+ if(_relics_spawn > 1){
+ obj_lava._create_obsidian = true;
+ _relics_spawn = 0;
+ }
+}
+
+if(_rm_name == "rm_mertola" ){
+ if(_relics_spawn > 1){
+ obj_carriage._drop_chest = true;
+ _relics_spawn = 0;
+ }
+ if(not(audio_is_playing(snd_bck_villa))){
+ audio_play_sound(snd_bck_villa,10,false);
+ }
+
+}
--- /dev/null
+switch(_state){
+ case GAME_STATES.WAITING:
+ event_user(_state);
+ break;
+ case GAME_STATES.HERO_SELECTION:
+ event_user(_state);
+ break;
+ case GAME_STATES.FIGHTING:
+ event_user(_state);
+ break;
+}
\ No newline at end of file
--- /dev/null
+{
+ "$GMObject":"",
+ "%Name":"obj_game_controller",
+ "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":64,"eventType":8,"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":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":0,"eventType":2,"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":1,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+ {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":2,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+ ],
+ "managed":true,
+ "name":"obj_game_controller",
+ "overriddenProperties":[],
+ "parent":{
+ "name":"Objects",
+ "path":"folders/Objects.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