diff --git a/Global.gd b/Global.gd index da3db770..f52cf577 100644 --- a/Global.gd +++ b/Global.gd @@ -2,7 +2,7 @@ extends Node signal nag_window() -var VERSION = "1.9.14-steam-unstable" +var VERSION = "1.9.16-steam-unstable" const RESOLUTION = Vector2(640, 360) var audio_player diff --git a/ObjectState.gd b/ObjectState.gd index eb6f704d..dc39708e 100644 --- a/ObjectState.gd +++ b/ObjectState.gd @@ -110,7 +110,7 @@ var enter_sfx_player var sfx_player var is_grab = false -var current_tick = -1 +var current_tick = -1 var current_real_tick = -1 var start_tick = -1 var last_facing = 1 diff --git a/characters/BaseChar.gd b/characters/BaseChar.gd index 01072450..cc002e8a 100644 --- a/characters/BaseChar.gd +++ b/characters/BaseChar.gd @@ -359,6 +359,11 @@ var feint_parriable = false var grounded_last_frame = true +var super_meter_used_recently = 0 +var super_meter_grace_ticks = 0 +const SUPER_METER_GRACE_PERIOD = 3 +const SUPER_METER_GRACE_DIVISOR = 2 + #var current_prediction = -1 var ghost_was_in_air = false @@ -589,7 +594,7 @@ func can_unlock_achievements(): func _ready(): sprite.animation = "Wait" state_variables.append_array( - ["current_di", "current_nudge", "got_blocked", "parry_combo", "busy", "air_option_bar", "air_option_bar_max", "blocked_last_turn", "burst_cancel_combo", "in_blockstring", "knockback_taken_modifier", "block_used_air_movement", "last_parry_tick", "grounded_last_frame", "wakeup_throw_immunity_ticks", "sadness_immunity_ticks", "blockstun_ticks", "guard_broken_this_turn", "counterhit_this_turn", "feint_parriable", "brace_enabled", "turn_frames", "last_turn_block", "parry_chip_divisor", "parry_knockback_divisor", "feinted_last", "hit_out_of_brace", "brace_effect_applied_yet", "braced_attack", "blocked_hitbox_plus_frames", "visible_combo_count", "melee_attack_combo_scaling_applied", "projectile_hit_cancelling", "used_buffer", "max_di_scaling", "min_di_scaling", "last_input", "penalty_buffer", "buffered_input", "use_buffer", "was_my_turn", "combo_supers", "penalty_ticks", "can_nudge", "buffer_moved_backward", "wall_slams", "moved_backward", "moved_forward", "buffer_moved_forward", "used_air_dodge", "refresh_prediction", "clipping_wall", "has_hyper_armor", "hit_during_armor", "colliding_with_opponent", "clashing", "last_pos", "penalty", "hitstun_decay_combo_count", "touching_wall", "feinting", "feints", "lowest_tick", "is_color_active", "blocked_last_hit", "combo_proration", "state_changed","nudge_amount", "initiative_effect", "reverse_state", "combo_moves_used", "parried_last_state", "initiative", "last_vel", "last_aerial_vel", "trail_hp", "always_perfect_parry", "parried", "got_parried", "parried_this_frame", "grounded_hits_taken", "on_the_ground", "hitlag_applied", "combo_damage", "burst_enabled", "di_enabled", "turbo_mode", "infinite_resources", "one_hit_ko", "dummy_interruptable", "air_movements_left", "super_meter", "supers_available", "parried", "parried_hitboxes", "burst_meter", "bursts_available"] + ["current_di", "current_nudge", "got_blocked", "super_meter_used_recently", "super_meter_grace_ticks", "parry_combo", "busy", "air_option_bar", "air_option_bar_max", "blocked_last_turn", "burst_cancel_combo", "in_blockstring", "knockback_taken_modifier", "block_used_air_movement", "last_parry_tick", "grounded_last_frame", "wakeup_throw_immunity_ticks", "sadness_immunity_ticks", "blockstun_ticks", "guard_broken_this_turn", "counterhit_this_turn", "feint_parriable", "brace_enabled", "turn_frames", "last_turn_block", "parry_chip_divisor", "parry_knockback_divisor", "feinted_last", "hit_out_of_brace", "brace_effect_applied_yet", "braced_attack", "blocked_hitbox_plus_frames", "visible_combo_count", "melee_attack_combo_scaling_applied", "projectile_hit_cancelling", "used_buffer", "max_di_scaling", "min_di_scaling", "last_input", "penalty_buffer", "buffered_input", "use_buffer", "was_my_turn", "combo_supers", "penalty_ticks", "can_nudge", "buffer_moved_backward", "wall_slams", "moved_backward", "moved_forward", "buffer_moved_forward", "used_air_dodge", "refresh_prediction", "clipping_wall", "has_hyper_armor", "hit_during_armor", "colliding_with_opponent", "clashing", "last_pos", "penalty", "hitstun_decay_combo_count", "touching_wall", "feinting", "feints", "lowest_tick", "is_color_active", "blocked_last_hit", "combo_proration", "state_changed","nudge_amount", "initiative_effect", "reverse_state", "combo_moves_used", "parried_last_state", "initiative", "last_vel", "last_aerial_vel", "trail_hp", "always_perfect_parry", "parried", "got_parried", "parried_this_frame", "grounded_hits_taken", "on_the_ground", "hitlag_applied", "combo_damage", "burst_enabled", "di_enabled", "turbo_mode", "infinite_resources", "one_hit_ko", "dummy_interruptable", "air_movements_left", "super_meter", "supers_available", "parried", "parried_hitboxes", "burst_meter", "bursts_available"] ) add_to_group("Fighter") connect("got_hit", self, "on_got_hit") @@ -691,6 +696,8 @@ func use_super_bar(): if supers_available < 0: supers_available = 0 super_meter = 0 + super_meter_grace_ticks = SUPER_METER_GRACE_PERIOD + super_meter_used_recently += MAX_SUPER_METER func use_super_meter(amount): if infinite_resources: @@ -994,8 +1001,21 @@ func apply_hitlag(hitbox, global=true): if global and host and host.get("enable_extra_aesthetic_hitstop"): buffered_global_hitlag = min(hitbox.hitlag_ticks * GLOBAL_HITLAG_MODIIFER, MAX_GLOBAL_HITLAG) +func get_active_projectiles(): + var objs = [] + for obj_name in objs_map: + var obj = obj_from_name(obj_name) + if obj and !obj.disabled and obj.id == id and !obj.is_in_group("Fighter"): + objs.append(obj) + return objs + func launched_by(hitbox): + if super_meter_used_recently > 0: + gain_super_meter_raw(super_meter_used_recently / SUPER_METER_GRACE_DIVISOR) + super_meter_used_recently = 0 + super_meter_grace_ticks = 0 + # if hitlag_ticks < hitbox.victim_hitlag: apply_hitlag(hitbox, hitbox.followup_state == "") feinting = false @@ -1119,123 +1139,8 @@ func counter_hitbox(hitbox): var pos = get_pos_visual() var hitbox_pos = Vector2(hitbox.pos_x, hitbox.pos_y) braced_attack = true -# spawn_particle_effect(preload("res://fx/ClashEffect.tscn"), (pos + hitbox_pos) / 2.0) -# current_state().enable_interrupt() -# if !opponent.is_in_hurt_state() and hitbox.host == opponent.obj_name: -# opponent.current_state().enable_interrupt() -# parried_hitboxes.append(hitbox.name) -# emit_signal("clashed") - prediction_effect() -#func hit_by(hitbox): -# if parried: -# return -# if hitbox.name in parried_hitboxes: -# return -# if !hitbox.hits_otg and is_otg(): -# return -# if !hitbox.hits_vs_dizzy and current_state().state_name == "HurtDizzy": -# return -# if can_counter_hitbox(hitbox): -# counter_hitbox(hitbox) -# elif current_state() is CounterAttack: -## if !hit_out_of_brace: -## opponent.combo_count -= 1 -# hit_out_of_brace = true -# if hitbox.throw and !is_otg(): -# return thrown_by(hitbox) -# if !can_parry_hitbox(hitbox): -# # probably need to coalesce the "take damage" and "got hit" signals here -# match hitbox.hitbox_type: -# Hitbox.HitboxType.Normal: -# launched_by(hitbox) -# Hitbox.HitboxType.NoHitstun: -# take_damage(hitbox.damage if opponent.combo_count <= 0 else hitbox.damage_in_combo) -# Hitbox.HitboxType.Burst: -# launched_by(hitbox) -# Hitbox.HitboxType.Flip: -# set_facing(get_facing_int() * -1, true) -# var vel = get_vel() -# set_vel(fixed.mul(vel.x, "-1"), vel.y) -# for hitbox in hitboxes: -# hitbox.facing = get_facing() -# pass -# emit_signal("got_hit") -# increment_opponent_combo(hitbox) -# take_damage(hitbox.get_damage(), hitbox.minimum_damage, hitbox.meter_gain_modifier) -# Hitbox.HitboxType.ThrowHit: -# emit_signal("got_hit") -# take_damage(hitbox.get_damage(), hitbox.minimum_damage, hitbox.meter_gain_modifier) -# opponent.incr_combo(hitbox.scale_combo, false, false, hitbox.combo_scaling_amount) -# Hitbox.HitboxType.OffensiveBurst: -# opponent.hitstun_decay_combo_count = 0 -# opponent.combo_proration = Utils.int_min(opponent.combo_proration, 0) -# launched_by(hitbox) -# reset_pushback() -# opponent.reset_pushback() -# else: -# opponent.got_parried = true -# var host = objs_map[hitbox.host] -# var projectile = !host.is_in_group("Fighter") -# var perfect_parry -# opponent.feinting = false -# if !projectile: -# perfect_parry = current_state().can_parry and (always_perfect_parry or opponent.current_state().feinting or opponent.feinting or (initiative and !blocked_last_hit) or parried_last_state) -# opponent.current_state().feinting = false -# else: -# perfect_parry = current_state().can_parry and (always_perfect_parry or host.always_parriable or parried_last_state or (current_state().current_tick < PROJECTILE_PERFECT_PARRY_WINDOW and host.has_projectile_parry_window)) -# if perfect_parry: -# parried_last_state = true -# else: -# blocked_last_hit = true -# -# parried = true -# -# hitlag_ticks = 0 -# parried_hitboxes.append(hitbox.name) -# var particle_location = current_state().get("particle_location") -# particle_location.x *= get_facing_int() -# -# if !particle_location: -# particle_location = hitbox.get_overlap_center_float(hurtbox) -# var parry_meter = PARRY_METER if hitbox.parry_meter_gain == -1 else hitbox.parry_meter_gain -# -# current_state().parry(perfect_parry) -# if !perfect_parry: -# if !projectile: -# opponent.add_penalty(-25) -# take_damage(fixed.round(fixed.mul(str(hitbox.damage / PARRY_CHIP_DIVISOR), hitbox.chip_damage_modifier))) -# apply_force_relative(fixed.mul(fixed.div(hitbox.knockback, fixed.mul(PARRY_KNOCKBACK_DIVISOR, "-1")), hitbox.block_pushback_modifier), "0") -# gain_super_meter(parry_meter / 3) -# opponent.gain_super_meter(parry_meter / 3) -# if !projectile: -# current_state().anim_length = opponent.current_state().anim_length -# current_state().endless = opponent.current_state().endless -# current_state().iasa_at = opponent.current_state().iasa_at -# current_state().current_tick = 0 -# current_state().interruptible_on_opponent_turn = true -# blocked_hitbox_plus_frames = hitbox.plus_frames -## for i in range(opponent.current_state().anim_length): -## if i > current_state().current_tick and i in opponent.current_state().hitbox_start_frames: -## current_state().anim_length = i -# spawn_particle_effect(preload("res://fx/FlawedParryEffect.tscn"), get_pos_visual() + particle_location) -# parried = false -# play_sound("Block") -# play_sound("Parry") -# if host.has_method("on_got_blocked"): -# host.on_got_blocked() -# else: -# if !projectile: -# opponent.add_penalty(-25) -# add_penalty(-25) -# else: -# if host.has_method("on_got_parried"): -# host.on_got_parried() -# gain_super_meter(parry_meter) -# spawn_particle_effect(preload("res://fx/ParryEffect.tscn"), get_pos_visual() + particle_location) -# play_sound("Parry2") -# play_sound("Parry") -# emit_signal("parried") + prediction_effect() func hit_by(hitbox, force_hit=false): @@ -1329,33 +1234,10 @@ func block_hitbox(hitbox, force_parry=false, force_block=false, ignore_guard_bre else: perfect_parry = current_state().can_parry and !current_state().get("push") and (always_perfect_parry or host.always_parriable or parried_last_state or (current_state().current_tick < PROJECTILE_PERFECT_PARRY_WINDOW and host.has_projectile_parry_window)) -# old -# if not projectile: -# if current_state() is GroundedParryState: -## perfect_parry = current_state().can_parry and (always_perfect_parry or (current_state().current_tick == current_state().data.x - 1) and (opponent.current_state().feinting or opponent.feinting or initiative)) -# var parry_timing = turn_frames + opponent.hitlag_ticks -# -# var in_parry_window = (parry_timing == current_state().data.count or current_state().data.count == 20 and turn_frames >= 20) or (hitbox.hitbox_type == Hitbox.HitboxType.Burst and combo_count > 0) -# var perfect_requirement = (opponent.current_state().feinting or opponent.feinting or initiative) -# perfect_parry = current_state().can_parry and (always_perfect_parry or (in_parry_window) and perfect_requirement and !blocked_last_hit) -# if opponent.feint_parriable: -# perfect_parry = true -# else: -# var parry_timing = turn_frames -# var in_parry_window = (parry_timing == current_state().data.count or current_state().data.count == 20 and turn_frames >= 20) or (hitbox.hitbox_type == Hitbox.HitboxType.Burst and combo_count > 0) -## perfect_parry = current_state().can_parry and (always_perfect_parry or opponent.current_state().feinting or opponent.feinting or (initiative and !blocked_last_hit) or parried_last_state) -# perfect_parry = current_state().can_parry and (always_perfect_parry or opponent.current_state().feinting or opponent.feinting or (initiative and !blocked_last_hit) or parried_last_state) -# -# else: -# perfect_parry = current_state().can_parry and (always_perfect_parry or host.always_parriable or parried_last_state or (current_state().current_tick < PROJECTILE_PERFECT_PARRY_WINDOW and host.has_projectile_parry_window)) -## perfect_parry = current_state().can_parry and (always_perfect_parry or host.always_parriable or (current_state().current_tick == current_state().data.x - 1 and host.has_projectile_parry_window)) if force_parry: perfect_parry = true if force_block: perfect_parry = false - -# if perfect_parry and !projectile and !current_state().get("real_parry"): -# perfect_parry = false if perfect_parry: parried_last_state = true @@ -1650,8 +1532,8 @@ func can_perfect_parry(): func can_parry_hitbox(hitbox): if not current_state() is ParryState: return false - if hitbox.hitbox_type == Hitbox.HitboxType.Flip: - return false +# if hitbox.hitbox_type == Hitbox.HitboxType.Flip: +# return true return current_state().can_parry_hitbox(hitbox) func set_color(color, extra_color_1=null, extra_color_2=null): @@ -1704,7 +1586,7 @@ func consume_feint(): if feints > 0: feints -= 1 else: - use_super_meter(MAX_SUPER_METER) + use_super_bar() ex_effect(0) func process_extra(extra): @@ -1763,21 +1645,6 @@ func refresh_air_movements(): func refresh_feints(): feints = num_feints -#func process_prediction(): -# if current_prediction == -1: -# prediction_processed = true -# return -# if prediction_correct(): -# play_sound("Predict") -# play_sound("Predict2") -# play_sound("Predict3") -# gain_super_meter(PREDICTION_CORRECT_SUPER_GAIN) -# emit_signal("predicted") -# else: -# hitlag_ticks += INCORRECT_PREDICTION_LAG -# opponent.gain_super_meter(PREDICTION_CORRECT_SUPER_GAIN) -# prediction_processed = true - func clean_parried_hitboxes(): # if is_ghost: # return @@ -2202,8 +2069,10 @@ func tick(): last_pos = pos if penalty_ticks > 0: penalty_ticks -= 1 - if current_tick % 3 == 0: + if current_tick % 3 == 0 and hp > 0: take_damage(2, 1) + if hp <= 0: + hp = 1 touching_wall = false var col_box = get_collision_box() @@ -2232,6 +2101,12 @@ func tick(): global_hitlag(buffered_global_hitlag) buffered_global_hitlag = 0 + + if super_meter_grace_ticks > 0: + super_meter_grace_ticks -= 1 + if super_meter_grace_ticks == 0: + super_meter_used_recently = 0 + if ReplayManager.playback: if "emotes" in ReplayManager.frames: if current_tick in ReplayManager.frames.emotes[id]: diff --git a/characters/mutant/Beast.gd b/characters/mutant/Beast.gd index 0cc038e8..24890bb7 100644 --- a/characters/mutant/Beast.gd +++ b/characters/mutant/Beast.gd @@ -25,6 +25,7 @@ onready var rebirth_particle_effect = $"%RebirthParticleEffect" var install_ticks = 0 var shockwave_projectile = null var spike_projectile = null +var bc_charge = false var juke_startup_ticks = 0 var juke_pips = JUKE_PIPS_PER_USE * 2 @@ -63,6 +64,7 @@ func process_action(action): can_air_dash = true func process_extra(extra): + bc_charge = false juke_startup_ticks = 0 juked_this_turn = false .process_extra(extra) @@ -121,6 +123,7 @@ func _on_hit_something(obj, hitbox): if obj.is_in_group("Fighter"): start_projectile_invulnerability() add_juke_pips(1) + bc_charge = true func on_parried(): @@ -142,6 +145,9 @@ func launched_by(hitbox): var obj = obj_from_name(spike_projectile) if obj: obj.disable() + + if juked_this_turn and opponent.current_state().state_name == "Burst": + add_juke_pips(JUKE_PIPS_PER_USE / 2) func on_blocked_something(): pass @@ -214,6 +220,8 @@ func tick(): juke_pips = JUKE_PIPS .tick() + + func on_got_parried(): if juked_this_turn: juke_ticks = 0 diff --git a/characters/mutant/DashThroughAttack.gd b/characters/mutant/DashThroughAttack.gd index 339d77b9..0258fcd5 100644 --- a/characters/mutant/DashThroughAttack.gd +++ b/characters/mutant/DashThroughAttack.gd @@ -1,20 +1,41 @@ extends BeastState +const TRACKING_SPEED = 7 +const MIN_TRACKING_SPEED = 40 + +var starting_dir = 0 +var tracking = false +var tracked_yet = false + func _frame_0(): + tracking = false + tracked_yet = false # host.disable_collisions() host.colliding_with_opponent = false apply_grav = false + starting_dir = host.get_opponent_dir() pass -func _frame_4(): - host.set_vel(fixed.mul(host.get_vel().x, "0.85"), "0") +#func _frame_4(): +# host.set_vel(fixed.mul(host.get_vel().x, "0.85"), "0") -func _frame_5(): +func _frame_15(): host.set_vel(fixed.mul(host.get_vel().x, "0.15"), "0") func _frame_6(): host.turn_around() +func _tick(): + var opp_dist = Utils.int_abs(host.obj_local_pos(host.opponent).x) + if current_tick > 3 and current_tick < 12 and !tracked_yet: + if host.get_opponent_dir() != starting_dir and opp_dist >= MIN_TRACKING_SPEED: + tracking = true + tracked_yet = true + if tracking and opp_dist >= MIN_TRACKING_SPEED: +# host.move_directly(host.get_opponent_dir() * TRACKING_SPEED, 0) + host.set_vel(str(-starting_dir * TRACKING_SPEED), host.get_vel().y) + if host.get_opponent_dir() == starting_dir: + tracking = false func _frame_10(): host.colliding_with_opponent = true @@ -24,6 +45,7 @@ func _frame_13(): apply_grav = true func _on_hit_something(obj, hitbox): + tracking = false host.set_vel(fixed.mul(host.get_vel().x, "0.75"), "0") func _got_parried(): diff --git a/characters/mutant/Mutant.tscn b/characters/mutant/Mutant.tscn index bd2828d8..018b06c4 100644 --- a/characters/mutant/Mutant.tscn +++ b/characters/mutant/Mutant.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=325 format=2] +[gd_scene load_steps=326 format=2] [ext_resource path="res://mechanics/Hitbox.gd" type="Script" id=1] [ext_resource path="res://HurtboxState.gd" type="Script" id=2] @@ -319,6 +319,7 @@ [ext_resource path="res://characters/CommandAt.gd" type="Script" id=317] [ext_resource path="res://characters/mutant/sprites/actionicons/back_dash_attack.png" type="Texture" id=318] [ext_resource path="res://characters/mutant/states/ForwardDashBackFollowup.gd" type="Script" id=319] +[ext_resource path="res://characters/mutant/states/OffensiveBurst.gd" type="Script" id=320] [sub_resource type="ShaderMaterial" id=1] resource_local_to_scene = true @@ -467,7 +468,7 @@ animations = [ { "name": "Grabbed", "speed": 5.0 }, { -"frames": [ ExtResource( 62 ), ExtResource( 62 ), ExtResource( 62 ), ExtResource( 60 ), ExtResource( 60 ), ExtResource( 60 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 63 ), ExtResource( 63 ), ExtResource( 59 ), ExtResource( 59 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ) ], +"frames": [ ExtResource( 62 ), ExtResource( 62 ), ExtResource( 62 ), ExtResource( 60 ), ExtResource( 60 ), ExtResource( 60 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 61 ), ExtResource( 58 ), ExtResource( 58 ), ExtResource( 61 ), ExtResource( 63 ), ExtResource( 63 ), ExtResource( 59 ), ExtResource( 59 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ), ExtResource( 64 ) ], "loop": true, "name": "GroundToAirSpin", "speed": 5.0 @@ -696,7 +697,8 @@ up_juke_ticks juke_dir_type juked_this_turn started_up_juke_from_ground -can_air_dash" +can_air_dash +bc_charge" enable_extra_aesthetic_hitstop = true num_air_movements = 3 character_portrait = ExtResource( 144 ) @@ -898,6 +900,8 @@ self_interruptable = false interrupt_from_string = "Swipe2" interrupt_into_string = "Grounded Aerial +Swipe2 + " hit_cancel_into_string = "GroundedAttack GroundedSpecial @@ -906,6 +910,7 @@ AerialAttack AerialSpecial AerialSuper Jump" +interrupt_exceptions_string = "OffensiveBurst" initiative_effect = true [node name="Hitbox3" type="Node2D" parent="StateMachine/Swipe2" index="0"] @@ -1036,7 +1041,8 @@ interrupt_from_string = "GroundedAttack Grounded" interrupt_into_string = "Grounded Aerial -Swipe2" +Swipe2 +" hit_cancel_into_string = "GroundedAttack GroundedSpecial GroundedSuper @@ -1045,6 +1051,7 @@ AerialAttack AerialSpecial AerialSuper Jump" +interrupt_exceptions_string = "OffensiveBurst" initiative_effect = true [node name="Hitbox3" type="Node2D" parent="StateMachine/Swipe" index="0"] @@ -1201,6 +1208,7 @@ hit_sound = ExtResource( 7 ) dir_x = "-1.0" dir_y = "-0.65" knockback = "7.0" +block_pushback_modifier = "0.5" grounded_hit_state = "HurtAerial" knockdown = true knockdown_extends_hitstun = false @@ -1267,7 +1275,8 @@ self_interruptable = false interrupt_from_string = "Grounded GroundedAttack" interrupt_into_string = "Grounded -Aerial" +Aerial +" hit_cancel_into_string = "GroundedAttack GroundedSpecial GroundedSuper @@ -1330,12 +1339,13 @@ land_cancel_state = "ShredLandCancel" next_state_on_hold_on_opponent_turn = true interrupt_from_string = "Grounded GroundedAttack" -interrupt_into_string = "Aerial -Grounded" +interrupt_into_string = "Grounded +Aerial +" force_air_juke = true grounded = true -[node name="Hitbox" type="Node2D" parent="StateMachine/GroundToAirSpin" index="0"] +[node name="Hitbox7" type="Node2D" parent="StateMachine/GroundToAirSpin" index="0"] z_index = 1000 script = ExtResource( 1 ) x = 4 @@ -1357,13 +1367,13 @@ whiff_sound = ExtResource( 31 ) hit_sound = ExtResource( 7 ) knockback = "5.0" vacuum = true -block_pushback_modifier = "0.25" +block_pushback_modifier = "-0.25" minimum_grounded_frames = 3 start_tick = 7 -active_ticks = 18 +active_ticks = 2 looping = true -[node name="Hitbox3" type="Node2D" parent="StateMachine/GroundToAirSpin" index="1"] +[node name="Hitbox8" type="Node2D" parent="StateMachine/GroundToAirSpin" index="1"] z_index = 1000 script = ExtResource( 1 ) x = 4 @@ -1385,13 +1395,13 @@ whiff_sound = ExtResource( 31 ) hit_sound = ExtResource( 7 ) knockback = "5.0" vacuum = true -block_pushback_modifier = "0.25" +block_pushback_modifier = "-0.25" minimum_grounded_frames = 3 start_tick = 7 -active_ticks = 18 +active_ticks = 2 looping = true -[node name="Hitbox2" type="Node2D" parent="StateMachine/GroundToAirSpin" index="2"] +[node name="Hitbox9" type="Node2D" parent="StateMachine/GroundToAirSpin" index="2"] z_index = 1000 script = ExtResource( 1 ) x = 2 @@ -1413,13 +1423,97 @@ whiff_sound = ExtResource( 31 ) hit_sound = ExtResource( 7 ) knockback = "5.0" vacuum = true -block_pushback_modifier = "0.25" +block_pushback_modifier = "-0.25" minimum_grounded_frames = 3 start_tick = 7 -active_ticks = 18 +active_ticks = 2 +looping = true + +[node name="Hitbox" type="Node2D" parent="StateMachine/GroundToAirSpin" index="3"] +z_index = 1000 +script = ExtResource( 1 ) +x = 4 +y = -16 +width = 10 +height = 28 +damage = 19 +chip_damage_modifier = "1.75" +hitstun_ticks = 10 +hitlag_ticks = 2 +victim_hitlag = 7 +damage_proration = 1 +cancellable = false +sdi_modifier = "0.3" +parry_meter_gain = 33 +plus_frames = 1 +hit_height = 0 +whiff_sound = ExtResource( 31 ) +hit_sound = ExtResource( 7 ) +knockback = "5.0" +vacuum = true +block_pushback_modifier = "0.25" +minimum_grounded_frames = 3 +start_tick = 11 +active_ticks = 14 +looping = true + +[node name="Hitbox3" type="Node2D" parent="StateMachine/GroundToAirSpin" index="4"] +z_index = 1000 +script = ExtResource( 1 ) +x = 4 +y = -16 +width = 16 +height = 19 +damage = 19 +chip_damage_modifier = "1.75" +hitstun_ticks = 10 +hitlag_ticks = 2 +victim_hitlag = 7 +damage_proration = 1 +cancellable = false +sdi_modifier = "0.3" +parry_meter_gain = 33 +plus_frames = 1 +hit_height = 0 +whiff_sound = ExtResource( 31 ) +hit_sound = ExtResource( 7 ) +knockback = "5.0" +vacuum = true +block_pushback_modifier = "0.25" +minimum_grounded_frames = 3 +start_tick = 11 +active_ticks = 14 +looping = true + +[node name="Hitbox2" type="Node2D" parent="StateMachine/GroundToAirSpin" index="5"] +z_index = 1000 +script = ExtResource( 1 ) +x = 2 +y = -14 +width = 22 +height = 8 +damage = 19 +chip_damage_modifier = "1.75" +hitstun_ticks = 10 +hitlag_ticks = 2 +victim_hitlag = 7 +damage_proration = 1 +cancellable = false +sdi_modifier = "0.3" +parry_meter_gain = 33 +plus_frames = 1 +hit_height = 0 +whiff_sound = ExtResource( 31 ) +hit_sound = ExtResource( 7 ) +knockback = "5.0" +vacuum = true +block_pushback_modifier = "0.25" +minimum_grounded_frames = 3 +start_tick = 11 +active_ticks = 14 looping = true -[node name="Hitbox4" type="Node2D" parent="StateMachine/GroundToAirSpin" index="3"] +[node name="Hitbox4" type="Node2D" parent="StateMachine/GroundToAirSpin" index="6"] z_index = 1000 script = ExtResource( 1 ) x = 4 @@ -1447,7 +1541,7 @@ minimum_grounded_frames = 3 start_tick = 25 active_ticks = 2 -[node name="Hitbox5" type="Node2D" parent="StateMachine/GroundToAirSpin" index="4"] +[node name="Hitbox5" type="Node2D" parent="StateMachine/GroundToAirSpin" index="7"] z_index = 1000 script = ExtResource( 1 ) x = 4 @@ -1475,7 +1569,7 @@ minimum_grounded_frames = 3 start_tick = 25 active_ticks = 2 -[node name="Hitbox6" type="Node2D" parent="StateMachine/GroundToAirSpin" index="5"] +[node name="Hitbox6" type="Node2D" parent="StateMachine/GroundToAirSpin" index="8"] z_index = 1000 script = ExtResource( 1 ) x = 2 @@ -1534,7 +1628,6 @@ damage = 95 damage_in_combo = 80 hitlag_ticks = 8 victim_hitlag = 12 -di_modifier = "1.5" plus_frames = -3 hit_height = 2 hit_sound = ExtResource( 105 ) @@ -1570,7 +1663,8 @@ self_interruptable = false interrupt_from_string = "GroundedAttack Grounded" interrupt_into_string = "Grounded -Aerial" +Aerial +" hit_cancel_into_string = "GroundedAttack GroundedSpecial GroundedSuper @@ -1641,7 +1735,8 @@ self_interruptable = false interrupt_from_string = "Grounded GroundedAttack" interrupt_into_string = "Grounded -Aerial" +Aerial +" [node name="Hitbox" type="Node2D" parent="StateMachine/OverheadClaw" index="0"] z_index = 1000 @@ -1690,9 +1785,11 @@ land_cancel_state = "ShredLandCancel" iasa_on_hit = 21 next_state_on_hold_on_opponent_turn = true interrupt_from_string = "Aerial -AerialAttack" -interrupt_into_string = "Aerial -Grounded" +AerialAttack +" +interrupt_into_string = "Grounded +Aerial +" [node name="Hitbox" type="Node2D" parent="StateMachine/AirSpin" index="0"] z_index = 1000 @@ -1886,7 +1983,8 @@ next_state_on_hold_on_opponent_turn = true self_hit_cancellable = false self_interruptable = false interrupt_into_string = "Grounded -Aerial" +Aerial +" hit_cancel_into_string = "GroundedAttack GroundedSpecial GroundedSuper @@ -1978,8 +2076,9 @@ iasa_on_hit = 9 next_state_on_hold_on_opponent_turn = true interrupt_from_string = "AerialAttack Aerial" -interrupt_into_string = "Aerial -Grounded" +interrupt_into_string = "Grounded +Aerial +" [node name="Hitbox" type="Node2D" parent="StateMachine/AirSwipe" index="0"] z_index = 1000 @@ -2121,6 +2220,7 @@ button_texture = ExtResource( 233 ) air_type = 2 land_cancel = true landing_recovery = 6 +min_land_cancel_frame = 9 iasa_on_hit = 25 next_state_on_hold = false self_hit_cancellable = false @@ -2700,21 +2800,21 @@ projectile_pos_x = 16 projectile_pos_y = -24 force_same_direction_as_previous_state = true throw_positions = { -ExtResource( 166 ): { -"x": -8, -"y": -17 -}, ExtResource( 160 ): { "x": 37, "y": -1 }, +ExtResource( 173 ): { +"x": 9, +"y": -11 +}, ExtResource( 169 ): { "x": 16, "y": -7 }, -ExtResource( 173 ): { -"x": 9, -"y": -11 +ExtResource( 166 ): { +"x": -8, +"y": -17 }, ExtResource( 171 ): { "x": 15, @@ -2915,6 +3015,7 @@ air_type = 2 uses_air_movement = true iasa_on_hit = 24 iasa_on_hit_on_block = false +allow_framecheat = true next_state_on_hold = false count_projectile_hits = false reversible = false @@ -3628,8 +3729,8 @@ script = ExtResource( 1 ) y = -15 width = 33 height = 23 -damage = 125 -minimum_damage = 30 +damage = 145 +minimum_damage = 50 hitstun_ticks = 20 hitlag_ticks = 10 victim_hitlag = 12 @@ -3866,6 +3967,16 @@ landing_recovery = 6 [node name="Hitbox" parent="StateMachine/Burst" index="0"] beats_grab = false +[node name="OffensiveBurst" parent="StateMachine" index="52"] +script = ExtResource( 320 ) +__meta__ = { +"_editor_description_": "" +} +interrupt_from_string = "Grounded +Aerial +OffensiveBurst +" + [node name="Hitbox" parent="StateMachine/OffensiveBurst" index="0"] beats_grab = false @@ -3963,6 +4074,12 @@ speed = "14" fric = "0.03" forward_dash_name = "AirDash" +[node name="WhiffInstantCancel" parent="StateMachine" index="76"] +interrupt_exceptions_string = "" + +[node name="WallSlam" parent="StateMachine" index="78"] +interrupt_exceptions_string = "" + [node name="Grabbed" parent="StateMachine" index="81"] anim_length = 4 ticks_per_frame = 2 @@ -3995,10 +4112,6 @@ enter_force_dir_x = "1.0" enter_force_dir_y = "-2.0" enter_force_speed = "4" throw_positions = { -ExtResource( 82 ): { -"x": -8, -"y": -5 -}, ExtResource( 79 ): { "x": 23, "y": 16 @@ -4006,6 +4119,10 @@ ExtResource( 79 ): { ExtResource( 81 ): { "x": -11, "y": -6 +}, +ExtResource( 82 ): { +"x": -8, +"y": -5 } } land_cancel = true diff --git a/characters/mutant/states/OffensiveBurst.gd b/characters/mutant/states/OffensiveBurst.gd new file mode 100644 index 00000000..27fdcb15 --- /dev/null +++ b/characters/mutant/states/OffensiveBurst.gd @@ -0,0 +1,4 @@ +extends "res://characters/states/OffensiveBurst.gd" + +func is_usable(): + return .is_usable() and host.bc_charge diff --git a/characters/mutant/states/SwipeAir.gd b/characters/mutant/states/SwipeAir.gd index dbba6e49..33ddceb3 100644 --- a/characters/mutant/states/SwipeAir.gd +++ b/characters/mutant/states/SwipeAir.gd @@ -2,6 +2,9 @@ extends BeastState export var grounded = false +func _enter(): + land_cancel_state = "Landing" + func _tick(): if (current_tick < (2 if !grounded else 5)) and host.combo_count <= 0: land_cancel_state = "Landing" diff --git a/characters/mutant/states/TwistAttack.gd b/characters/mutant/states/TwistAttack.gd index 0a8d0466..26acf31b 100644 --- a/characters/mutant/states/TwistAttack.gd +++ b/characters/mutant/states/TwistAttack.gd @@ -43,6 +43,16 @@ func _enter(): hitbox.vacuum = false hitbox_2.vacuum = false +func _frame_0(): + allow_framecheat = true + next_state_on_hold_on_opponent_turn = false + next_state_on_hold = false + +func _frame_25(): + allow_framecheat = false + next_state_on_hold_on_opponent_turn = true + next_state_on_hold = true + func _frame_6(): moving = true diff --git a/characters/robo/Missile.gd b/characters/robo/Missile.gd index b8dac70d..24c34994 100644 --- a/characters/robo/Missile.gd +++ b/characters/robo/Missile.gd @@ -5,6 +5,7 @@ var missiles_left = MISSILES func _enter(): missiles_left = MISSILES + func process_projectile(obj): .process_projectile(obj) # var vel = host.get_vel() diff --git a/characters/robo/Robot.gd b/characters/robo/Robot.gd index 73cddf7a..0d7fb6f0 100644 --- a/characters/robo/Robot.gd +++ b/characters/robo/Robot.gd @@ -100,32 +100,30 @@ func _ready(): drive_jump_sprite.set_material(sprite.get_material()) for ghost in chainsaw_arm_ghosts: ghost.set_material(sprite.get_material()) - setup_magnet_circle() -func setup_magnet_circle(): - if is_ghost: - return - - var magnet_poly_size = 2000 - - magnet_polygon.polygon = PoolVector2Array() - magnet_polygon2.polygon = PoolVector2Array() - - for mp in [magnet_polygon, magnet_polygon2]: - var outer = [] - var hole = [] - for i in range(65): - var t = ((PI / 64.0) * i) - var vec1 = Utils.ang2vec(t) * float(MAGNET_CENTER_DIST) - var vec2 = Utils.ang2vec(t) * float(magnet_poly_size) - if mp == magnet_polygon2: - vec1 *= -1 - vec2 *= -1 - outer.append(vec1) - hole.append(vec2) - - var clipped = Geometry.clip_polygons_2d(PoolVector2Array(hole), PoolVector2Array(outer)) - mp.polygon = clipped[0] +# setup_magnet_circle() + +#func setup_magnet_circle(): +# if is_ghost: +# return +# var magnet_poly_size = 2000 +# magnet_polygon.polygon = PoolVector2Array() +# magnet_polygon2.polygon = PoolVector2Array() +# for mp in [magnet_polygon, magnet_polygon2]: +# var outer = [] +# var hole = [] +# for i in range(65): +# var t = ((PI / 64.0) * i) +# var vec1 = Utils.ang2vec(t) * float(MAGNET_CENTER_DIST) +# var vec2 = Utils.ang2vec(t) * float(magnet_poly_size) +# if mp == magnet_polygon2: +# vec1 *= -1 +# vec2 *= -1 +# outer.append(vec1) +# hole.append(vec2) +# +# var clipped = Geometry.clip_polygons_2d(PoolVector2Array(hole), PoolVector2Array(outer)) +# mp.polygon = clipped[0] func init(pos=null): .init(pos) @@ -155,6 +153,12 @@ func on_launched(): func on_grabbed(): on_launched() +func are_missiles_active(): + for object in get_active_projectiles(): + if object and object.get("IS_ROBOT_MISSILE"): + return true + return false + func copy_to(f: BaseObj): .copy_to(f) f.armor_active = armor_active @@ -422,13 +426,7 @@ func start_magnetizing(): play_sound("MagnetBeep") stop_hustle_fx() start_magnet_fx() -# var my_pos_relative = opponent.obj_local_center(self) -# var dist = fixed.vec_len(str(my_pos_relative.x), str(my_pos_relative.y)) -# if fixed.gt(dist, MAGNET_CENTER_DIST): -# opponent.reset_momentum() -# pass magnet_installed = false -# started_magnet_in_initiative = false func stop_flying(): diff --git a/characters/robo/Robot.tscn b/characters/robo/Robot.tscn index a1d2fd5b..dee93215 100644 --- a/characters/robo/Robot.tscn +++ b/characters/robo/Robot.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=498 format=2] +[gd_scene load_steps=499 format=2] [ext_resource path="res://characters/BaseChar.tscn" type="PackedScene" id=1] [ext_resource path="res://characters/robo/Robot.gd" type="Script" id=2] @@ -489,6 +489,7 @@ [ext_resource path="res://characters/robo/Missile.gd" type="Script" id=487] [ext_resource path="res://characters/robo/projectiles/Missile.tscn" type="PackedScene" id=488] [ext_resource path="res://characters/robo/sprites/actionicons/missile.png" type="Texture" id=489] +[ext_resource path="res://characters/robo/states/FastDriveCancel.gd" type="Script" id=490] [sub_resource type="ShaderMaterial" id=2] resource_local_to_scene = true @@ -1093,6 +1094,7 @@ unique_name_in_owner = true visible = false position = Vector2( 0, -24 ) frames = SubResource( 7 ) +frame = 1 playing = true offset = Vector2( 0, 10 ) @@ -1101,6 +1103,7 @@ unique_name_in_owner = true visible = false position = Vector2( 0, -16 ) frames = SubResource( 9 ) +frame = 1 playing = true [node name="HustleEffect" parent="Flip/Particles" index="0" instance=ExtResource( 391 )] @@ -1750,7 +1753,30 @@ knockdown_extends_hitstun = false hard_knockdown = true start_tick = 11 -[node name="HostCommand" type="Node" parent="StateMachine/SideKick" index="1"] +[node name="Hitbox2" type="Node2D" parent="StateMachine/SideKick" index="1"] +z_index = 1000 +script = ExtResource( 83 ) +x = 11 +y = -25 +width = 6 +height = 6 +damage = 95 +hitstun_ticks = 60 +victim_hitlag = 8 +damage_proration = -1 +beats_grab = false +plus_frames = 2 +whiff_sound = ExtResource( 153 ) +hit_sound = ExtResource( 88 ) +dir_y = "-0.1" +knockback = "12.0" +grounded_hit_state = "HurtAerial" +knockdown = true +knockdown_extends_hitstun = false +hard_knockdown = true +start_tick = 11 + +[node name="HostCommand" type="Node" parent="StateMachine/SideKick" index="2"] script = ExtResource( 460 ) tick = 14 command = "try_drive_cancel" @@ -2269,29 +2295,29 @@ enter_sfx = ExtResource( 208 ) enter_sfx_volume = -8.0 force_same_direction_as_previous_state = true throw_positions = { -ExtResource( 201 ): { -"x": -15, -"y": 0 -}, -ExtResource( 202 ): { -"x": -14, -"y": -48 +ExtResource( 203 ): { +"x": -37, +"y": -11 }, ExtResource( 200 ): { "x": 5, "y": -12 }, -ExtResource( 205 ): { -"x": -39, -"y": -37 +ExtResource( 202 ): { +"x": -14, +"y": -48 +}, +ExtResource( 201 ): { +"x": -15, +"y": 0 }, ExtResource( 204 ): { "x": 8, "y": -32 }, -ExtResource( 203 ): { -"x": -37, -"y": -11 +ExtResource( 205 ): { +"x": -39, +"y": -37 } } update_facing_on_exit = false @@ -2379,7 +2405,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2403,7 +2428,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2427,7 +2451,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2451,7 +2474,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2515,7 +2537,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2539,7 +2560,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2563,7 +2583,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2587,7 +2606,6 @@ hits_vs_grounded = false followup_state = "DisembowelGrabFollowup" beats_grab = false block_cancel_allowed = false -plus_frames = -1 hit_height = 0 hit_sound = ExtResource( 281 ) dir_y = "1.0" @@ -2746,33 +2764,25 @@ sfx_tick = 7 sfx_volume = -8.0 force_same_direction_as_previous_state = true throw_positions = { -ExtResource( 116 ): { -"x": 33, -"y": -38 -}, -ExtResource( 118 ): { -"x": 67, +ExtResource( 109 ): { +"x": 70, "y": 15 }, -ExtResource( 115 ): { -"x": -41, -"y": -46 -}, -ExtResource( 108 ): { -"x": -16, -"y": -46 +ExtResource( 112 ): { +"x": -40, +"y": -44 }, ExtResource( 113 ): { "x": 62, "y": -13 }, -ExtResource( 109 ): { -"x": 70, -"y": 15 +ExtResource( 108 ): { +"x": -16, +"y": -46 }, -ExtResource( 114 ): { -"x": -20, -"y": -58 +ExtResource( 110 ): { +"x": 65, +"y": -12 }, ExtResource( 111 ): { "x": -31, @@ -2782,13 +2792,21 @@ ExtResource( 117 ): { "x": 69, "y": 14 }, -ExtResource( 110 ): { -"x": 65, -"y": -12 +ExtResource( 114 ): { +"x": -20, +"y": -58 }, -ExtResource( 112 ): { -"x": -40, -"y": -44 +ExtResource( 118 ): { +"x": 67, +"y": 15 +}, +ExtResource( 116 ): { +"x": 33, +"y": -38 +}, +ExtResource( 115 ): { +"x": -41, +"y": -46 } } iasa_at = 56 @@ -2847,33 +2865,33 @@ enter_sfx = ExtResource( 155 ) enter_sfx_volume = -10.0 force_same_direction_as_previous_state = true throw_positions = { +ExtResource( 264 ): { +"x": 124, +"y": -72 +}, +ExtResource( 262 ): { +"x": 40, +"y": -33 +}, +ExtResource( 260 ): { +"x": 40, +"y": -34 +}, ExtResource( 253 ): { "x": 116, "y": -66 }, -ExtResource( 263 ): { -"x": 124, -"y": -72 -}, ExtResource( 258 ): { "x": 78, "y": -50 }, -ExtResource( 264 ): { +ExtResource( 263 ): { "x": 124, "y": -72 }, ExtResource( 254 ): { "x": 124, "y": -72 -}, -ExtResource( 262 ): { -"x": 40, -"y": -33 -}, -ExtResource( 260 ): { -"x": 40, -"y": -34 } } interrupt_into_string = "Grounded @@ -3187,33 +3205,25 @@ sfx_tick = 7 sfx_volume = -8.0 force_same_direction_as_previous_state = true throw_positions = { -ExtResource( 116 ): { -"x": 33, -"y": -38 -}, -ExtResource( 118 ): { -"x": 67, +ExtResource( 109 ): { +"x": 70, "y": 15 }, -ExtResource( 115 ): { -"x": -41, -"y": -46 -}, -ExtResource( 108 ): { -"x": -16, -"y": -46 +ExtResource( 112 ): { +"x": -40, +"y": -44 }, ExtResource( 113 ): { "x": 62, "y": -13 }, -ExtResource( 109 ): { -"x": 70, -"y": 15 +ExtResource( 108 ): { +"x": -16, +"y": -46 }, -ExtResource( 114 ): { -"x": -20, -"y": -58 +ExtResource( 110 ): { +"x": 65, +"y": -12 }, ExtResource( 111 ): { "x": -31, @@ -3223,13 +3233,21 @@ ExtResource( 117 ): { "x": 69, "y": 14 }, -ExtResource( 110 ): { -"x": 65, -"y": -12 +ExtResource( 114 ): { +"x": -20, +"y": -58 }, -ExtResource( 112 ): { -"x": -40, -"y": -44 +ExtResource( 118 ): { +"x": 67, +"y": 15 +}, +ExtResource( 116 ): { +"x": 33, +"y": -38 +}, +ExtResource( 115 ): { +"x": -41, +"y": -46 } } iasa_at = 49 @@ -3931,10 +3949,6 @@ sfx_volume = -8.0 flip_frame = 11 force_same_direction_as_previous_state = true throw_positions = { -ExtResource( 431 ): { -"x": 33, -"y": 12 -}, ExtResource( 429 ): { "x": 36, "y": 13 @@ -3946,6 +3960,10 @@ ExtResource( 432 ): { ExtResource( 427 ): { "x": -19, "y": -12 +}, +ExtResource( 431 ): { +"x": 33, +"y": 12 } } title = "Back Throw" @@ -4120,7 +4138,10 @@ start_tick = 5 endless = true [node name="FastDriveCancel" type="Node2D" parent="StateMachine" index="54"] -script = ExtResource( 94 ) +script = ExtResource( 490 ) +__meta__ = { +"_editor_description_": "" +} apply_forces = true apply_fric = true apply_grav = true @@ -4569,21 +4590,21 @@ sfx_tick = 14 sfx_volume = -8.0 flip_frame = 8 throw_positions = { -ExtResource( 374 ): { -"x": 14, -"y": -7 +ExtResource( 373 ): { +"x": 34, +"y": -11 }, ExtResource( 372 ): { "x": -24, "y": -6 }, +ExtResource( 374 ): { +"x": 14, +"y": -7 +}, ExtResource( 375 ): { "x": 31, "y": -8 -}, -ExtResource( 373 ): { -"x": 34, -"y": -11 } } iasa_at = 20 @@ -4910,33 +4931,33 @@ enter_force_speed = "10" enter_sfx = ExtResource( 459 ) enter_sfx_volume = -10.0 throw_positions = { -ExtResource( 449 ): { -"x": 7, -"y": -22 -}, -ExtResource( 450 ): { -"x": 15, -"y": 21 -}, -ExtResource( 445 ): { -"x": -17, -"y": 18 -}, ExtResource( 448 ): { "x": -16, "y": -2 }, -ExtResource( 443 ): { -"x": -12, -"y": 21 +ExtResource( 451 ): { +"x": -13, +"y": -24 }, ExtResource( 447 ): { "x": 52, "y": 49 }, -ExtResource( 451 ): { -"x": -13, -"y": -24 +ExtResource( 443 ): { +"x": -12, +"y": 21 +}, +ExtResource( 445 ): { +"x": -17, +"y": 18 +}, +ExtResource( 449 ): { +"x": 7, +"y": -22 +}, +ExtResource( 450 ): { +"x": 15, +"y": 21 } } iasa_at = 40 @@ -5125,9 +5146,9 @@ ExtResource( 62 ): { "x": 26, "y": -16 }, -ExtResource( 310 ): { +ExtResource( 308 ): { "x": -21, -"y": -15 +"y": -8 }, ExtResource( 304 ): { "x": 29, @@ -5137,9 +5158,9 @@ ExtResource( 309 ): { "x": -21, "y": -9 }, -ExtResource( 308 ): { +ExtResource( 310 ): { "x": -21, -"y": -8 +"y": -15 } } release_frame = 18 @@ -5218,9 +5239,9 @@ ExtResource( 62 ): { "x": 27, "y": -19 }, -ExtResource( 310 ): { -"x": -20, -"y": -16 +ExtResource( 308 ): { +"x": -22, +"y": -12 }, ExtResource( 304 ): { "x": 34, @@ -5230,9 +5251,9 @@ ExtResource( 309 ): { "x": -21, "y": -11 }, -ExtResource( 308 ): { -"x": -22, -"y": -12 +ExtResource( 310 ): { +"x": -20, +"y": -16 } } release_frame = 18 diff --git a/characters/robo/RobotState.gd b/characters/robo/RobotState.gd index de03fc00..5d8ef5b8 100644 --- a/characters/robo/RobotState.gd +++ b/characters/robo/RobotState.gd @@ -12,7 +12,7 @@ export var can_fly = true export var throw_invuln_frames = 0 export var super_scale_combo_meter = true -func is_usable(): +func is_usable(): if !is_super: return .is_usable() return .is_usable() and host.supers_available >= super_level diff --git a/characters/robo/projectiles/Missile.tscn b/characters/robo/projectiles/Missile.tscn index 06017ed5..c4747ce2 100644 --- a/characters/robo/projectiles/Missile.tscn +++ b/characters/robo/projectiles/Missile.tscn @@ -30,7 +30,8 @@ script = ExtResource( 4 ) gravity = "0.2" max_air_speed = "40" max_fall_speed = "15" -extra_state_variables = "detected_friends" +extra_state_variables = "detected_friends +" deletes_other_projectiles = false [node name="Sprite" parent="Flip" index="0"] diff --git a/characters/robo/states/FastDriveCancel.gd b/characters/robo/states/FastDriveCancel.gd new file mode 100644 index 00000000..ecae7399 --- /dev/null +++ b/characters/robo/states/FastDriveCancel.gd @@ -0,0 +1,5 @@ +extends RobotState + +func _tick(): + if current_tick == 3 and host.turn_frames < 10: + current_tick = 2 diff --git a/characters/robo/states/Magnetize.gd b/characters/robo/states/Magnetize.gd index d1bdaf9f..837f79ee 100644 --- a/characters/robo/states/Magnetize.gd +++ b/characters/robo/states/Magnetize.gd @@ -14,4 +14,4 @@ func _tick(): enable_interrupt() func is_usable(): - return host.magnet_ticks_left <= 0 and .is_usable() and host.grenade_object != null + return .is_usable() and (host.magnet_ticks_left <= 0 and host.grenade_object != null) diff --git a/characters/robo/states/Propel.gd b/characters/robo/states/Propel.gd index 9269060b..77e8e9b8 100644 --- a/characters/robo/states/Propel.gd +++ b/characters/robo/states/Propel.gd @@ -4,11 +4,17 @@ const FRICTION_TICKS = 20 const GROUND_FRICTION = "0.2" const FORCE = "1" + +func _enter(): + next_state_on_hold = !host.buffer_drive_cancel +# fallback_state = "Wait" if !host.buffer_drive_cancel else "Drive" + func _frame_0(): host.chara.set_ground_friction(GROUND_FRICTION) host.propel_friction_ticks = FRICTION_TICKS host.start_fly_fx() + func _exit(): host.stop_fly_fx() diff --git a/characters/stickman/Stickman.gd b/characters/stickman/Stickman.gd index 9db5b4c7..2612c592 100644 --- a/characters/stickman/Stickman.gd +++ b/characters/stickman/Stickman.gd @@ -212,7 +212,8 @@ func on_got_parried(): pass func on_blocked_something(): - stored_speed_1 = fixed.sub(stored_speed_1, SPEED_LOST_ON_HIT) +# stored_speed_1 = fixed.sub(stored_speed_1, SPEED_LOST_ON_HIT) + pass func on_got_hit(): if bomb_projectile or bomb_thrown: @@ -221,7 +222,7 @@ func on_got_hit(): if bomb_object: bomb_object.disable() bomb_projectile = null - stored_speed_1 = fixed.sub(stored_speed_1, SPEED_LOST_ON_HIT) +# stored_speed_1 = fixed.sub(stored_speed_1, SPEED_LOST_ON_HIT) func stack_move_in_combo(move_name): .stack_move_in_combo(move_name) diff --git a/characters/swordandgun/projectiles/AfterImageExplosion.tscn b/characters/swordandgun/projectiles/AfterImageExplosion.tscn index c9995064..470191b5 100644 --- a/characters/swordandgun/projectiles/AfterImageExplosion.tscn +++ b/characters/swordandgun/projectiles/AfterImageExplosion.tscn @@ -36,7 +36,6 @@ material = SubResource( 1 ) has_projectile_parry_window = false deletes_other_projectiles = false movable = false -free_cancel_on_hit = false [node name="Sprite" parent="Flip" index="0"] frames = SubResource( 2 ) diff --git a/characters/wizard/Wizard.tscn b/characters/wizard/Wizard.tscn index ef1a59ae..8a41413c 100644 --- a/characters/wizard/Wizard.tscn +++ b/characters/wizard/Wizard.tscn @@ -857,10 +857,22 @@ default_dash_speed boulder_projectile" damages_own_team = true throw_positions = { +ExtResource( 326 ): { +"x": 40, +"y": -10 +}, ExtResource( 320 ): { "x": 62, "y": -126 }, +ExtResource( 321 ): { +"x": 60, +"y": -124 +}, +ExtResource( 323 ): { +"x": 62, +"y": -128 +}, ExtResource( 322 ): { "x": 40, "y": -28 @@ -868,18 +880,6 @@ ExtResource( 322 ): { ExtResource( 325 ): { "x": 58, "y": -78 -}, -ExtResource( 323 ): { -"x": 62, -"y": -128 -}, -ExtResource( 321 ): { -"x": 60, -"y": -124 -}, -ExtResource( 326 ): { -"x": 40, -"y": -10 } } enable_extra_aesthetic_hitstop = true @@ -1281,8 +1281,6 @@ interrupt_into_string = "Aerial Grounded" hit_cancel_into_string = "Aerial Grounded" -interrupt_exceptions_string = "IceSpikeAir -" trigger_orb_type = "Sword" trigger_orb_delay = 10 @@ -1301,6 +1299,7 @@ hitstun_ticks = 14 hitlag_ticks = 6 victim_hitlag = 6 cancellable = false +block_cancel_allowed = false plus_frames = 1 hit_height = 0 screenshake_amount = 5 @@ -1324,6 +1323,7 @@ hitstun_ticks = 14 hitlag_ticks = 6 victim_hitlag = 6 cancellable = false +block_cancel_allowed = false plus_frames = 1 hit_height = 0 screenshake_amount = 5 @@ -1955,10 +1955,22 @@ anim_length = 70 sfx = ExtResource( 217 ) sfx_tick = 10 throw_positions = { +ExtResource( 326 ): { +"x": 40, +"y": -10 +}, ExtResource( 320 ): { "x": 62, "y": -126 }, +ExtResource( 321 ): { +"x": 60, +"y": -124 +}, +ExtResource( 323 ): { +"x": 62, +"y": -128 +}, ExtResource( 322 ): { "x": 40, "y": -28 @@ -1966,18 +1978,6 @@ ExtResource( 322 ): { ExtResource( 325 ): { "x": 58, "y": -78 -}, -ExtResource( 323 ): { -"x": 62, -"y": -128 -}, -ExtResource( 321 ): { -"x": 60, -"y": -124 -}, -ExtResource( 326 ): { -"x": 40, -"y": -10 } } type = 1 @@ -2258,6 +2258,7 @@ type = 2 button_texture = ExtResource( 232 ) flip_icon = false air_type = 2 +next_state_on_hold = false interrupt_from_string = "Grounded GroundedSpecial Aerial @@ -2284,7 +2285,7 @@ cancellable = false increment_combo = false can_clash = false beats_grab = false -plus_frames = -1 +plus_frames = 1 screenshake_amount = 0 replace_hit_particle = true whiff_particle = ExtResource( 231 ) @@ -2308,7 +2309,7 @@ cancellable = false increment_combo = false can_clash = false beats_grab = false -plus_frames = -1 +plus_frames = 1 priority = 1 screenshake_amount = 0 replace_hit_particle = true diff --git a/characters/wizard/states/ConfusingTouch.gd b/characters/wizard/states/ConfusingTouch.gd index 1531a891..4c843b27 100644 --- a/characters/wizard/states/ConfusingTouch.gd +++ b/characters/wizard/states/ConfusingTouch.gd @@ -4,9 +4,13 @@ const PUSH_FORCE = "5.0" func _frame_0(): iasa_at = -1 + next_state_on_hold = true + next_state_on_hold_on_opponent_turn = true func _on_hit_something(obj, hitbox): ._on_hit_something(obj, hitbox) obj.apply_force(fixed.mul(str(host.get_facing_int()), PUSH_FORCE), "0") + next_state_on_hold = false + next_state_on_hold_on_opponent_turn = false iasa_at = 12 pass diff --git a/ui/SteamLobby/SteamLobbyList.gd b/ui/SteamLobby/SteamLobbyList.gd index 3b5f7259..434c4b2e 100644 --- a/ui/SteamLobby/SteamLobbyList.gd +++ b/ui/SteamLobby/SteamLobbyList.gd @@ -67,13 +67,13 @@ func _process(delta): if !is_visible_in_tree(): return t += delta - var color = Color("ffd519").linear_interpolate(Color("65e6ff"), sin(t * 10)) - $"%CharloaderButton".set("custom_colors/font_color", color) - $"%CharloaderButton".set("custom_colors/font_color_hover", color) - $"%CharloaderButton".set("custom_colors/font_color_pressed", color) +# var color = Color("ffd519").linear_interpolate(Color("65e6ff"), sin(t * 3)) +# $"%CharloaderButton".set("custom_colors/font_color", color) +# $"%CharloaderButton".set("custom_colors/font_color_hover", color) +# $"%CharloaderButton".set("custom_colors/font_color_pressed", color) if exclamation_button.visible: exclamation_button.rect_position.y = exclamation_button_y + sin(t * 30) * 3 - +#